
    <html lang="zh-cn">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <link href="F:\v_awjliu\BKDocs\ZH/default.css" rel="stylesheet">
    </head>
    <body>
    <h1 id="_1">产品简介</h1>
<p>蓝鲸权限中心（BKIAM）是蓝鲸智云提供的集中权限管理服务，支持基于蓝鲸开发框架的SaaS和企业第三方系统的权限控制接入，以及支持细粒度的权限管理。</p>
<h2 id="_2">权限集中接入</h2>
<p>蓝鲸各平台或 SaaS 已经内置到权限中心，企业开箱即用，针对企业第三方系统或者在蓝鲸开发的 SaaS 同样可以快速对接到蓝鲸权限中心，详情参考 <a href="../../../iam_dev_docs/QuickStart/01-Begin.md">系统接入开发指引</a></p>
<p><img alt="image-20201110095219983" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品简介/README/image-20201110095219983.png" /></p>
<h2 id="_3">细粒度权限管理</h2>
<p>管理员可以给不同岗位的员工分配具体某些实例的权限，让权限管理更灵活。</p>
<p><img alt="image-20201110095158988" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品简介/README/image-20201110095158988.png" /></p><h1 id="_1">工作原理</h1>
<p>本章节讲解从系统接入到用户访问鉴权的整体交互原理，可以大致了解蓝鲸权限中心的工作原理。</p>
<p><img alt="flow_02" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品简介/Principle/flow_02.png" /></p><h1 id="_1">使用限制</h1>
<h2 id="_2">数量限制</h2>
<table><tbody>
<tr><td width="20%">限制类型</td><td width="60%">限制项</td><td width="20%">限制值</td></tr>
<tr><td width="20%" rowspan="3">用户</td><td width="60%">一个用户可加入的用户组数</td><td width="20%">100</td></tr>
<tr><td width="60%">一个用户可授权的单个操作关联的资源实例数</td><td width="20%">10000</td></tr>
<tr><td width="60%">一个用户可加入的分级管理员数</td><td width="20%">100</td></tr>
<tr><td width="20%" rowspan="3">用户组</td><td width="60%">一个用户组可以绑定单个系统的权限模板数</td><td width="20%">10</td></tr>
<tr><td width="60%">一个用户组可添加的成员（用户或组织）数</td><td width="20%">1000</td></tr>
<tr><td width="60%">一个用户组可授权的单个操作关联的资源实例数</</td><td width="20%">10000</td></tr>
<tr><td width="20%" rowspan="3">分级管理员</td><td width="60%">一个分级管理员可创建的用户组数</</td><td width="20%">100</td></tr>
<tr><td width="60%">一个分级管理员可添加的成员（用户或组织）数</</td><td width="20%">100</td></tr>
<tr><td width="60%">每个系统可创建的分级管理员数</</td><td width="20%">3000</td></tr>
</tbody></table>

<h2 id="_3">命名长度限制</h2>
<table><tbody>
<tr><td width="20%">限制类型</td><td width="60%">限制项</td><td width="20%">限制值</td></tr>
<tr><td width="20%">用户组</td><td width="60%">用户组名称的字符数</td><td width="20%">5 - 128</td></tr>
<tr><td width="20%">分级管理员</td><td width="60%">分级管理员名称的字符数</td><td width="20%">128</td></tr>
<tr><td width="20%">权限模板</td><td width="60%">权限模板名称的字符数</td><td width="20%">128</td></tr>
<tr><td width="20%">常用操作</td><td width="60%">常用操作名称的字符数</td><td width="20%">128</td></tr>
</tbody></table><h1 id="_1">术语解释</h1>
<p>在使用蓝鲸权限中心产品前，快速了解一些基本名词概念。</p>
<h2 id="_2">系统</h2>
<p>蓝鲸体系内各大平台或 SaaS，非蓝鲸框架的应用需在蓝鲸开发者中心注册为蓝鲸 SaaS。</p>
<h2 id="_3">操作</h2>
<p>接入系统中需要做权限控制的某个场景功能，如作业新建、主机转移、菜单查看等，一个操作最好是最小原子功能，操作应该是<strong>可枚举相对静态的</strong>，一个系统的操作数量有可能随着系统功能模块的增加而增加，但一般不会随着时间的推移无限增长。</p>
<h2 id="_4">资源类型</h2>
<p>简称 <strong>资源</strong> ，指各系统需要做权限控制的<strong>操作</strong>所关联的对象，如<strong>作业新建</strong>关联的对象是<strong>作业</strong>、<strong>主机转移</strong>关联的对象是<strong>主机</strong>等，作业、主机都是一种<strong>资源类型</strong>。</p>
<h2 id="_5">资源实例</h2>
<p>资源实例是某种资源类型的具体实例化对象，也是权限控制的最小粒度，如具体<strong>某个作业</strong>、<strong>某台主机</strong>等，一般来说资源实例是<strong>动态的</strong>，会随着时间推移线性增长。 </p>
<h2 id="_6">实例视图</h2>
<p>接入系统可以根据自己的业务场景，向权限中心自定义<code>注册</code>多种实例视图，一种实例视图代表了一种实例的选择方式，用户在申请权限关联资源实例时，可以切换不同的 <strong>实例视图</strong> 来选择实例权限。</p>
<p><img alt="image-20210322111756643" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/术语解释/Trem/image-20210322111756643.png" /></p>
<h2 id="_7">资源属性</h2>
<p><strong>资源属性</strong> 是权限中心筛选资源实例的一种方式，满足那些需要动态授权的场景。</p>
<p><img alt="image-20210409154928258" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/术语解释/Trem/image-20210409154928258.png" /></p>
<h2 id="_8">新建关联权限</h2>
<p>为了方便用户的权限获得，权限中心提供了新建关联权限的功能，用户申请某个资源的新建操作时，可以 <strong>同时获得</strong> 新建资源实例的其他操作权限。比如用户申请<strong>作业新建</strong>权限，用户新建某个作业时，自动拥有该作业的<strong>删除、编辑、查看</strong>等权限，不需要用户二次申请。</p>
<h2 id="_9">依赖操作</h2>
<p>当用户申请的操作权限必须依赖其他某些前置操作权限时，比如用户申请 <strong>作业编辑</strong> ，必须依赖 <strong>作业查看</strong> 的操作权限，作业查看 就是 作业编辑 的依赖操作，用户不需要关心依赖操作，权限中心会自动处理依赖逻辑，用户直奔目标选择需要的权限即可。</p>
<h2 id="_10">依赖资源</h2>
<p>在蓝鲸权限中心，接入系统分别注册 <code>操作</code> 和 <code>资源</code> ，也需要注册操作和资源的关联关系，操作关联的资源称为这个操作的依赖资源，依赖资源必须是该操作 <code>缺一不可</code> 的，对一个操作来说可有可无的资源不是依赖资源，一个操作的依赖资源可以没有依赖资源，也可以有多个，多个依赖资源的注册顺序跟前端展示和鉴权顺序保持一致。</p>
<blockquote>
<p>比如 作业执行 操作的依赖资源是作业、主机、账号，因为要执行一个作业，这三个资源是缺一不可的，但脚本就不是依赖资源，因为一个作业可以没有脚本步骤。</p>
</blockquote>
<p>大部分操作的依赖资源都包含目标资源，但也存在依赖资源是上级资源的情况。</p>
<blockquote>
<p>比如 作业编辑 的依赖资源就是作业本身，但是 作业新建 的依赖资源则是他的上级资源 业务，因为作业只能选择在某个业务下新建。</p>
</blockquote>
<h2 id="_11">操作组</h2>
<p>操作组是接入系统，根据系统使用习惯，将相同场景的操作按操作组归类，方便用户/管理员在权限中心勾选操作权限。
操作组只是前端勾选操作时的体验优化，不涉及底层逻辑的依赖。</p>
<blockquote>
<p>比如，作业平台有<code>作业执行、作业删除、脚本执行、脚本查看、IP白名单新建、全局设置管理</code>几个操作。</p>
</blockquote>
<p>加上操作组后，前端表现为：
<img alt="image-20210322111439099" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/术语解释/Trem/image-20210322111439099.png" /></p>
<p>操作组名称，操作组以及组内元素顺序，由各接入系统定义，目前权限中心支持<code>两级操作组</code>设置。</p>
<p><strong>重要！！！！</strong>
<code>各接入系统根据需要，可以定义0（不需要分类）、1、2级操作组</code>，操作可以按照<code>资源类型归类</code>、也可以按照<code>用户使用场景来归类</code>，<code>一个操作只能属于一个操作组，不能重叠。</code></p>
<h2 id="_12">版本</h2>
<p>权限中心针对接入系统注册的资源和操作，提供 <code>版本</code> 支持，版本仅用来给接入系统在系统接入页面区分新旧资源和操作的展示。</p>
<h2 id="_13">权限模板</h2>
<p>权限模板是若干操作的集合，一个权限模板代表了一种岗位角色需要的场景权限，比如运维、开发、测试，一个模板只能包含一个系统的操作。</p>
<h2 id="_14">用户组</h2>
<p>用户组是权限中心推荐的权限管理方式，一个用户组可以关联多个系统的多个权限模板，从而具备对应的权限，管理员只需要往用户组添加<strong>用户/组织</strong>即可让对应的用户获得用户组的所具备的权限。</p>
<h2 id="_15">自定义权限</h2>
<p>权限中心除了通过用户组方式来管理用户权限，还支持更加灵活的授权方式：自定义权限，用户可以选择任意的操作和实例作为他场景需要的权限，由于该权限的灵活性，不像用户组那样方便管理，所以为了不给后期权限管理带来混乱，请谨慎使用，当前 1 个人拥有<strong>1个操作 + 1个资源类型</strong>的实例权限<strong>最大</strong>数量为 10000 个。</p>
<h2 id="_16">分级管理员</h2>
<p>分级管理员是权限中心的二级权限管理员，成为分级管理员后可以分配相应的资源权限给其他用户。</p><h1 id="_1">核心优势</h1>
<p>蓝鲸权限中心是基于 ABAC 强大权限模型，结合蓝鲸体系内各种业务场景而研发的通用的权限管控产品，可以满足各种业务场景的权限管控场景。</p>
<h2 id="_2">强大的权限模型引擎</h2>
<p>蓝鲸权限中心底层基于业界功能最强大的 ABAC(Attribute-Based Access Control)，即基于属性的访问控制，同时也融合了 ACL(Access Control List)、RBAC(Role-Based Access Control)、LBAC(Label-Based Access Control)的理念，使得蓝鲸权限中心能够支持尽可能丰富的业务权限场景。</p>
<h2 id="_3">细粒度的权限控制</h2>
<p>蓝鲸权限中心支持实例级别的权限控制粒度。</p>
<h2 id="_4">灵活的权限获取方式</h2>
<p>用户想要获得权限，可以基于多种途径获取：自定义申请、申请加入用户组、接入系统侧无权限跳转、管理员授权，蓝鲸权限中心推荐通过<code>用户组</code>来管理权限。</p>
<h2 id="_5">权限分级管理</h2>
<p>蓝鲸权限中心支持<strong>超级管理员、系统管理员、分级管理员</strong>三种级别的管理模式，超级管理员拥有整个平台的权限分配能力，系统管理员拥有对应系统的权限分配能力，分级管理员则是一种更加灵活的权限管理方式，它可以拥有任意操作及实例范围的权限分配能力。</p>
<h2 id="_6">组织架构权限管理</h2>
<p>蓝鲸权限中心支持通过组织架构来管理权限，包括个人、组织的权限管理。</p><h1 id="_1">产品架构图</h1>
<p><img alt="image-20210322222404821" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品架构/Architecture/image-20210322222404821.png" /></p><h1 id="_1">创建权限模板</h1>
<p>当多个用户组需要涉及同一批权限的添加时，蓝鲸权限中心建议先创建权限模板，再把权限模板关联用户组的方式来达到权限关联的目的，创建权限模板是管理员（超级管理员、系统管理员、分级管理员）的能力。</p>
<h2 id="_2">前置条件</h2>
<blockquote>
<p>登录用户需要切换到管理员角色（超级管理员、系统管理员、分级管理员）</p>
</blockquote>
<h2 id="_3">操作步骤</h2>
<ol>
<li>切换到<strong>管理员身份</strong>。</li>
</ol>
<p><img alt="image-20201210105441469" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210105441469.png" /></p>
<ol>
<li>点击<strong>权限模板</strong>菜单进入权限模板列表页。</li>
</ol>
<p><img alt="image-20201210105735916" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210105735916.png" /></p>
<ol>
<li>点击<strong>新建</strong>按钮创建权限模板。</li>
</ol>
<p><img alt="image-20201210105834597" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210105834597.png" /></p>
<ol>
<li>创建完权限模板，我们可以将该模板关联某些用户组，对应用户组就具备了该权限模板所包含的权限。</li>
</ol>
<p><img alt="image-20201210105927183" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210105927183.png" /></p>
<ol>
<li>权限模板保存后，可以再次进行编辑，点击需要编辑的权限模板名称，进入模板详情页面，点击<strong>编辑</strong>按钮进行模板编辑 ，编辑完成 保存。</li>
</ol>
<p><img alt="image-20201210110014114" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210110014114.png" /></p>
<ol>
<li>权限模板编辑意味着模板的更新，模板更新后可以<strong>同步</strong>到已经关联的用户组。</li>
</ol>
<p><img alt="image-20201210110107399" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreatePremissionTemplates/image-20201210110107399.png" /></p><h1 id="_1">创建用户组</h1>
<p>蓝鲸权限中心<strong>推荐</strong>通过用户组的方式来管理权限，可以关联权限模板来给一个用户组授权，然后通过将用户或组织加入用户组，这些用户或组织就自动拥有了该用户组的权限。 </p>
<h2 id="_2">前置条件</h2>
<blockquote>
<ol>
<li>
<p>登录用户需要切换到管理员角色（超级管理员、系统管理员、分级管理员）</p>
</li>
<li>
<p>创建好权限模板</p>
</li>
</ol>
</blockquote>
<h2 id="_3">操作步骤</h2>
<ol>
<li>切换到<strong>管理员身份</strong>。</li>
</ol>
<p><img alt="image-20201210105441469" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreateGroups/image-20201210105441469.png" /></p>
<ol>
<li>点击<strong>用户组</strong>菜单，进入用户组列表页。</li>
</ol>
<p><img alt="image-20201210105543517" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreateGroups/image-20201210105543517.png" /></p>
<ol>
<li>点击<strong>新建</strong>按钮创建新用户组。</li>
</ol>
<p><img alt="image-20201210105615861" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/CreateGroups/image-20201210105615861.png" /></p>
<ul>
<li>用户组名：<code>必填</code>，全局唯一，用户组名必须大于 4 个字符。</li>
<li>描述：<code>必填</code>，将用户组的功能描述清楚，便于管理员或者用户申请时辨识。</li>
<li>添加组成员：<code>非必填</code>，组成员包括用户和组织，表示给对应的成员分配该组的权限。</li>
<li>添加组权限：<code>非必填</code>，组权限添加已经创建好的权限模板，表示将权限赋予该组。</li>
</ul><h1 id="_1">申请加入用户组</h1>
<h2 id="_2">前置条件</h2>
<blockquote>
<p>存在已经创建好的用户组。</p>
</blockquote>
<h2 id="_3">操作步骤</h2>
<ol>
<li>点击<strong>权限申请</strong>进入权限申请页面。</li>
</ol>
<p><img alt="image-20201210104811158" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToGroups/image-20201210104811158.png" /></p>
<ol>
<li>点击<strong>申请加入用户组-立即申请</strong>按钮，进入用户组申请页面，选择需要申请的用户组、申请期限，填写申请理由。</li>
</ol>
<p><img alt="image-20201210104945325" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToGroups/image-20201210104945325.png" /></p>
<ol>
<li>点击<strong>提交</strong>，提交后等待审批人审批，审批通过后，在<strong>我的权限</strong>页面可以查看刚才申请的用户组。</li>
</ol>
<p><img alt="image-20201210105033285" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToGroups/image-20201210105033285.png" /></p><h1 id="_1">申请自定义权限</h1>
<h2 id="_2">前置条件</h2>
<blockquote>
<p>无</p>
</blockquote>
<p>蓝鲸权限中心<strong>推荐</strong>通过用户组来统一管理权限，当没有合适的已有用户组或者需要的权限比较单一时，可以通过申请自定义权限。本章节以<strong>作业平台</strong>权限为例讲解如何申请自定义权限。  </p>
<p>自定义权限申请入口，可以从<strong>自定义权限申请</strong>或者<strong>从接入系统侧无权限跳转</strong>。</p>
<h2 id="_3">自定义权限申请入口</h2>
<h3 id="_4">操作步骤</h3>
<ol>
<li>点击<strong>权限申请</strong>菜单，进入权限申请页面。</li>
</ol>
<p><img alt="image-20201210104742156" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20201210104742156.png" /></p>
<ol>
<li>点击<strong>申请自定义权限-立即申请</strong>按钮，进入自定义权限申请页面，依次选择<strong>系统、操作、资源实例</strong>，保存。</li>
</ol>
<p><img alt="image-20201113141632048" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20201113141632048.png" /></p>
<ol>
<li>点击<strong>提交</strong>，提交后等待审批人审批，审批通过后，在<strong>我的权限</strong>页面可以查看刚才申请的自定义权限。</li>
</ol>
<p><img alt="image-20201113112504194" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20201113112504194.png" /></p>
<ol>
<li>打开<strong>作业平台</strong>，切换到<strong>脚本执行</strong>页面，选择刚才申请的主机，点击<code>执行</code>按钮，因为申请了权限，所以这里可以执行成功。</li>
</ol>
<p><img alt="image-20201113141734175" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20201113141734175.png" /></p>
<h2 id="_5">从接入系统侧无权限跳转</h2>
<h3 id="_6">操作步骤</h3>
<ol>
<li>用户直接访问接入系统页面，接入系统会提示用户无权限并申请需要的操作权限。</li>
</ol>
<p><img alt="image-20200921215730298" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20200921215730298.png" /></p>
<ol>
<li>点击<strong>去申请</strong>自动跳转到权限中心，跳转时会自动带上用户需要的操作和实例权限，用户直接点击提交即可完成权限申请。</li>
</ol>
<p><img alt="image-20200921220101732" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToCustomPermissions/image-20200921220101732.png" /></p><h1 id="_1">二级权限管理</h1>
<h2 id="_2">场景描述</h2>
<p>某企业拥有多款业务，每个业务都有专门的业务负责人来管理权限，比如A业务的业务负责人需要给开发人员、产品人员、测试人员分配相应的业务访问权限。</p>
<h2 id="_3">解决方案</h2>
<p>蓝鲸权限中心提供了分级权限管理解决方案，由超级管理员创建或者业务负责人自己申请创建<a href="../产品功能/GradingManager.md">分级管理员</a>，成为分级管理员后，就可以自主管理权限。</p>
<p><img alt="分级管理员2" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/场景案例/GradingManager/分级管理员2.png" /></p>
<ul>
<li>由<a href="../产品功能/ManagerCreate.md">超级管理员创建</a>，或者A业务负责人<a href="../产品功能/UserApply.md">申请创建分级管理员</a></li>
<li>点击<strong>右上角个人信息</strong>切换到<strong>A业务分级管理员</strong>身份</li>
<li>点击<strong>权限模板</strong>菜单，分别创建<strong>运维</strong>、<strong>开发</strong>、<strong>测试</strong>的权限模板</li>
<li>点击<strong>用户组</strong>菜单，分别创建<strong>运维</strong>、<strong>开发</strong>、<strong>测试</strong>的用户组，并分别关联前一步创建的权限模板</li>
<li>分别将运维、开发、测试人员添加到对应的用户组完成授权</li>
</ul><h1 id="_1">权限申请</h1>
<p>用户可以通过三种方式主动申请需要的权限：<strong>申请加入用户组</strong>、<strong>申请自定义权限</strong>、<strong>从接入系统侧无权限跳转</strong>。</p>
<h2 id="_2">申请加入用户组</h2>
<p>蓝鲸权限中心<strong>推荐</strong>的权限管理方式，用户进入权限申请页面 ，点击<strong>申请加入用户组</strong>按钮进行申请，在申请用户组列表页面，用户只需要通过关键词搜索到需要的用户组，申请加入即可。</p>
<p><img alt="image-20201210104945325" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/快速入门/ApplyToGroups/image-20201210104945325.png" /></p>
<h2 id="_3">申请自定义权限</h2>
<p>自定义权限建议是在用户组权限无法满足的情况下才申请，自定义权限虽然灵活，但零散的权限带来的后果就是不方便后续权限的统一管理。</p>
<p>用户在<strong>权限申请</strong>界面，点击<strong>申请自定义权限</strong>按钮进行申请。</p>
<p><img alt="image-20201210114221531" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionsApply/image-20201210114221531.png" /></p>
<p>权限中心支持<strong>拓扑实例选择</strong>、<strong>属性条件</strong>两种实例选择方式，大部分接入系统只接入拓扑实例选择方式。</p>
<ul>
<li>
<p>拓扑实例选择：如果接入系统提供了多种视图选择，用户在拓扑实例选择这里可以通过多种方式来选择想要的实例，拓扑实例除了叶子节点外，其他节点均为动态节点，即选择了当前节点，默认就包含了所有子级的节点，包括未来新加的子节点。拓扑实例选择能满足大部分用户的选择需求。</p>
</li>
<li>
<p>属性条件：属性条件是一种高级的实例筛选方式，属性条件是动态选择方式，对于那些经常有实例变动或者需要范围权限的用户来说，属性条件是更好的方式。</p>
</li>
</ul>
<p>一组实例选择，可以通过<strong>拓扑实例选择</strong>或<strong>属性条件</strong>，也可以组合使用，组合使用时，拓扑实例和属性条件是<strong>且</strong>的关系。多组实例之间是<code>或</code>的关系。</p>
<p><img alt="image-20200921211124608" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionsApply/image-20200921211124608.png" /></p><h1 id="_1">我的申请</h1>
<p><strong>我的申请</strong>页面展示个人的权限申请记录，用户申请完权限后，自动跳转到该页面，可以查看当前<strong>审批中、已通过、被拒绝、已撤销</strong>状态的单据，针对审批中的单据，可以查看当前节点的审批人员。</p>
<p><img alt="image-20201111093207005" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyApply/image-20201111093207005.png" /></p><h1 id="_1">我的审批</h1>
<p>审批功能已经对接到ITSM，所以在<strong>我的审批</strong>，点击后自动跳转到ITSM的待办单据。</p>
<p><img alt="image-20201210114750183" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyApproval/image-20201210114750183.png" /></p><h1 id="_1">我的权限</h1>
<p><strong>我的权限</strong>页面展示个人拥有的所有权限，分<strong>用户组权限</strong>、<strong>自定义权限</strong>两部分权限展示。同一个操作权限可以同时在自定义权限和用户组权限里，删除其中一个来源无影响。</p>
<h2 id="_2">用户组权限</h2>
<p>用户可以在<strong>用户组权限</strong>Tab 页进行申请新的用户组权限或者选择退出某个用户组。用户加入用户组的方式有两种：直接加入、通过组织加入。</p>
<ul>
<li>直接加入：指用户直接被添加到某个用户组里，用户如不需要该组的权限 ，可以直接在<strong>我的权限-用户组权限</strong>里选择对应的用户组，点击<strong>退出</strong>。</li>
<li>通过组织加入：指用户所在的组织被添加到某个用户组里，用户如不需要该组的权限，无法直接退出，必须管理员将用户所在组织从该组里移除。</li>
</ul>
<p><img alt="image-20201210114839328" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyPermissions/image-20201210114839328.png" /></p>
<h2 id="_3">自定义权限</h2>
<p>自定义权限是用户通过<strong>自定义权限申请</strong>而获得的权限，该方式并不是权限中心推荐使用，因为自定义权限太灵活，不方便后续权限的统一维护。</p>
<p><img alt="image-20201210115712303" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyPermissions/image-20201210115712303.png" /></p>
<p>自定义权限按照系统分组聚合展示，用户可以在该页面继续申请自定义权限，或者删除部分权限，部分权限的删除包括<strong>操作权限和实例权限</strong>。</p>
<ul>
<li><strong>实例权限删除</strong>：找到需要删除实例权限对应的操作，点击实例详情，在实例详情页里，点击<strong>批量实例删除</strong>可以进行实例权限的删除。</li>
</ul>
<p><img alt="image-20201210115833432" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyPermissions/image-20201210115833432.png" /></p>
<ul>
<li><strong>操作权限删除</strong>：如不需要某个操作的权限 ，可以在权限列表里找到对应的操作权限，直接删除。</li>
</ul>
<p><img alt="image-20201210115911567" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/MyPermissions/image-20201210115911567.png" /></p><h1 id="_1">内置管理角色</h1>
<p>为了方便管理员管理权限，蓝鲸权限中心内置了三种管理角色：超级管理员、系统管理员、分级管理员。</p>
<p><strong>admin</strong>既是初始的唯一登录账号，也是默认的唯一超级管理员。</p>
<p><strong>超级管理员</strong>、<strong>系统管理员</strong>属于特殊的分级管理员。</p>
<ul>
<li>超级管理员：默认拥有蓝鲸平台的所有<strong>授权</strong>权限（admin 默认拥有蓝鲸平台所有<strong>授权</strong>和<strong>操作</strong>权限），可以配置拥有所有<strong>操作</strong>权限，详见<a href="./Manager.md#超级管理员设置">超级管理员设置</a></li>
<li>系统管理员：默认拥有对应系统的所有<strong>授权</strong>权限，可以配置拥有对应系统的所有<strong>操作</strong>权限，详见<a href="./Manager.md#系统管理员设置">系统管理员设置</a></li>
<li>分级管理员：默认拥有分级管理范围内的所有资源的<strong>授权</strong>权限，如需操作权限，需要通过自授权来实现，详见<a href="./GradingManager.md">分级管理员</a></li>
</ul>
<table>
<thead>
<tr>
<th>默认权限</th>
<th>超级管理员</th>
<th>系统管理员</th>
<th>分级管理员</th>
</tr>
</thead>
<tbody>
<tr>
<td>权限模板新建</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>权限模板编辑</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>权限模板查看</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>权限模板删除</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>权限模板关联用户组</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>用户组新建</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>用户组查看</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>用户组删除</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>用户组成员管理</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>用户组权限管理</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>管理员功能设置</td>
<td>✓</td>
<td>✓</td>
<td></td>
</tr>
<tr>
<td>审批流程设置</td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
</tr>
<tr>
<td>组织架构权限管理</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
<tr>
<td>分级管理员新建</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
<tr>
<td>分级管理员编辑</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
<tr>
<td>分级管理员删除</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
<tr>
<td>分级管理员查看</td>
<td>✓</td>
<td></td>
<td></td>
</tr>
</tbody>
</table><h1 id="_1">分级管理员</h1>
<p>分级管理员的定位是<strong>权限管理能力下放</strong>，将原本只能超级管理员或者系统管理员授权的工作，根据权限管理的需求将<strong>授权能力</strong>分配给各个分级管理员。</p>
<p>分级管理员由<strong>操作和资源实例范围</strong>和<strong>被授权人员范围</strong>组成。</p>
<ul>
<li><strong>操作和资源实例范围</strong>：决定了分级管理员能够授予的最大权限范围，可以只是某一个资源实例授权，也可以是基于所有资源实例范围的授权。</li>
<li><strong>可授权人员范围</strong>：决定了分级管理员能够给哪些人员授权，以及只有在被授权人员范围内的用户才能申请到对应分级管理员创建的用户组。人员可以是某些用户，也可以是某些组织。 </li>
</ul>
<p><img alt="image-20201210104243675" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/GradingManager/image-20201210104243675.png" /></p>
<p>分级管理员可以由<a href="./ManagerCreate.md">超级管理员创建</a>或者<a href="./UserApply.md">普通用户申请创建</a>。</p><h1 id="_1">超级管理员创建分级管理员</h1>
<p>以有超级管理员身份的账号登录到蓝鲸权限中心，在<code>右上角</code>个人信息里切换到<code>超级管理员</code>身份，进入到<code>分级管理员</code>页面，点击<code>新建</code>创建分级管理员。</p>
<p><img alt="image-20201029143648601" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201029143648601.png" /></p>
<h2 id="_2">基本信息</h2>
<ul>
<li>分级管理员名称：区分不同分级管理员，根据需求场景来命名，可以随时修改。</li>
<li>成员列表：分级管理员的成员都具备该分级管理员的相关权限，即具体某个分级管理员的管理成员。</li>
<li>描述：描述分级管理员的职能。</li>
</ul>
<h2 id="_3">选择操作和资源实例范围</h2>
<p><strong>操作和资源实例范围</strong>代表该分级管理员能够<code>授权</code>的权限范围，可以跨系统选择多个操作。</p>
<p><img alt="image-20201029145638479" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201029145638479.png" /></p>
<p>选择操作后，需要针对每个操作进行对应的实例范围选择，实例选择可以选择具体实例，也可以通过属性条件来实现动态实例的选择。</p>
<p>比如，选择了 A 系统的 a 操作，对应的实例是 i1，i2，i3，则该分级管理员就只能给其他人授予 a 操作的 i1、i2、i3 这几个实例内的权限。</p>
<p><img alt="image-20201209185808659" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201209185808659.png" /></p>
<h2 id="_4">选择可授权人员范围</h2>
<p><strong>可授权人员范围</strong>代表该分级管理员能够<code>授权</code>的人员范围，反过来，也只有在可授权人员范围内的用户才能看到对应分级管理员所创建的用户组，双向的限制，避免了不必要的权限给用户带来的干扰，也避免敏感权限外泄，人员可以是组织，也可以是具体某个用户。</p>
<blockquote>
<p>比如，选择了<code>组织：广东分公司、用户：user</code>，则该分级管理员只能给这两类人授权，也只有他们才能看到对应分级管理员创建的用户组，去申请加入。</p>
</blockquote>
<p><img alt="-w2021" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201029152316625.png" /></p>
<p>选择完操作实例和人员范围，点击<code>提交</code>即完成分级管理员的创建。 </p>
<h2 id="_5">切换分级管理员身份</h2>
<p>能够切换分级管理员身份的前提是成为分级管理员的管理成员。</p>
<p><img alt="image-20201117093004886" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201117093004886.png" /></p>
<p>点击右上角<strong>个人信息</strong>，点击<strong>切换身份</strong>，选择需要的身份进行切换。</p>
<p><img alt="image-20201117093220231" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/ManagerCreate/image-20201117093220231.png" /></p><h1 id="_1">普通用户申请创建分级管理员</h1>
<p>用户登陆蓝鲸，打开权限中心，点击<strong>分级管理员</strong>菜单，进入分级管理员列表页，该页面展示自己可以使用的分级管理员列表。</p>
<p>点击<strong>申请新建</strong>进行分级管理员创建申请。</p>
<p><img alt="image-20201209174306845" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201209174306845.png" /></p>
<p>填写分级管理员基本信息，选择分配权限和授权人员<strong>范围</strong>。</p>
<p><img alt="image-20201209175203048" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201209175203048.png" /></p>
<h2 id="_2">基本信息</h2>
<ul>
<li>分级管理员名称：区分不同分级管理员，根据需求场景来命名，可以随时修改。</li>
<li>成员列表：分级管理员的成员都具备该分级管理员的相关权限，即具体某个分级管理员的管理成员。</li>
<li>描述：描述分级管理员的职能。</li>
</ul>
<h2 id="_3">选择操作和资源实例范围</h2>
<p><strong>操作和资源实例范围</strong>代表该分级管理员<strong>能够授权的权限范围</strong>，可以跨系统选择多个操作。</p>
<p><img alt="image-20201209175841973" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201209175841973.png" /></p>
<p>选择操作后，需要针对每个操作进行对应的实例范围选择，实例选择可以选择具体实例，也可以通过属性条件来实现动态实例的选择。</p>
<blockquote>
<p>比如，选择了 A 系统的 a 操作，对应的实例是 i1，i2，i3，则该分级管理员就只能给其他人授予 a 操作的 i1、i2、i3 这几个实例内的权限。</p>
</blockquote>
<p><img alt="image-20201209175949478" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201209175949478.png" /></p>
<h2 id="_4">选择可授权人员范围</h2>
<p><strong>可授权人员范围</strong>代表该分级管理员能够<code>授权</code>的人员范围(注意这里不是授权)，也只有在可授权人员范围内的用户才能看到对应分级管理员所创建的用户组，双向的限制，避免了不必要的权限给用户带来的干扰，也避免敏感权限外泄，人员可以是组织，也可以是具体某个用户。</p>
<p>比如，选择了<code>组织：广东分公司、用户：user</code>，则该分级管理员只能给这两类人授权，也只有他们才能看到对应分级管理员创建的用户组，去申请加入。</p>
<p><img alt="image-20201209180247928" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201209180247928.png" /></p>
<p>选择完操作实例和人员范围，点击<code>提交</code>即完成分级管理员的申请创建，申请创建分级管理员需要审批，审批通过后，可以在分级管理员列表看到对应的记录。</p>
<h2 id="_5">切换分级管理员身份</h2>
<p>点击右上角<strong>个人信息</strong>，点击<strong>切换身份</strong>，选择需要的身份进行切换。</p>
<p><img alt="image-20201117093220231" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/UserApply/image-20201117093220231.png" /></p><h1 id="_1">权限模板</h1>
<h2 id="_2">前置条件</h2>
<blockquote>
<ol>
<li>
<p>用户必须是分级管理员/超级管理员/系统管理员</p>
</li>
<li>
<p>切换到管理员身份</p>
</li>
</ol>
</blockquote>
<p><img alt="image-20201209191849425" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionTemplates/image-20201209191849425.png" /></p>
<p>权限模板的主要作用是<strong>可复用性</strong>，分级管理员创建一个权限模板，可以给多个用户组关联授权，而且权限模板更新后可以同步给已关联授权的用户组。</p>
<h2 id="_3">新建权限模板</h2>
<p>进入<strong>权限模板</strong>页面，点击<strong>新建</strong>按钮进行模板新建，一个模板只能包含<strong>一个系统</strong>的操作权限。</p>
<p><img alt="image-20210411203830159" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionTemplates/image-20210411203830159.png" /></p>
<h2 id="_4">权限模板编辑</h2>
<p>在<strong>权限模板</strong>页面，选择具体需要编辑的权限模板，点击<strong>权限模板名称</strong>进入权限模板的详情页面，点击详情页里的编辑按钮进行模板编辑。</p>
<p><img alt="image-20210411205031258" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionTemplates/image-20210411205031258.png" /></p>
<p>权限模板如果未关联任何用户组，编辑更新操作后可以直接保存。</p>
<p>如果已经关联了用户组，点击<strong>下一步</strong>进行用户组同步，选择模板新增的操作在各个用户组里需要的资源实例，权限中心提供两种可以批量刷实例的方式。</p>
<p><strong>批量粘贴</strong>：用户先选择操作在一个用户组里的实例，然后在输入框尾部点击<strong>复制</strong>按钮，复制成功后，立即为弹出<strong>批量粘贴</strong>小icon，点击批量粘贴后，即可将对应的实例刷到其他用户组里，达到批量刷实例的效果。</p>
<p><strong>批量引用已有操作的资源实例</strong>：该功能是当<strong>同一个操作在不同用户组里选择的实例不一样</strong>的场景时使用，比如，<strong>业务访问</strong>这个操作在100个用户组里对应的实例都不一样时，这个时候用批量粘贴的方式或者人工选择的方式都是不可行的。</p>
<p>这时可以通过<strong>批量引用已有操作的资源实例</strong>来完成，在输入框右上角点击该按钮，选择一个模板里已有的操作，确定后，自动批量填充到每个用户组。 </p>
<p><img alt="image-20210411213529054" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/PermissionTemplates/image-20210411213529054.png" /></p><h1 id="_1">用户/组织</h1>
<h2 id="_2">前置条件</h2>
<blockquote>
<ol>
<li>用户是超级管理员身份</li>
<li>切换到超级管理员身份</li>
</ol>
</blockquote>
<p><img alt="image-20201209191849425" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Users/image-20201209191849425.png" /></p>
<p>蓝鲸权限中心默认以组织架构的形式同步了蓝鲸用户管理的人员组织信息，方便管理员以<strong>人</strong>和<strong>组织</strong>的维度管理权限。</p>
<p>在<strong>用户</strong>菜单里，我们可以查看某人或某个组织的权限，并且对其进行权限管理。</p>
<h2 id="_3">管理用户权限</h2>
<p>点击<strong>用户</strong>菜单，通过搜索查找需要管理权限的<strong>用户</strong>，选择具体某个用户后，可以对其权限进行删减。</p>
<p><img alt="image-20201209192920927" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Users/image-20201209192920927.png" /></p>
<h2 id="_4">管理组织权限</h2>
<p>进入用户菜单，通过搜索查找需要管理权限的<strong>组织</strong>，选择具体某个组织后，可以对其权限进行删减。</p>
<p><img alt="image-20201209193058032" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Users/image-20201209193058032.png" /></p><h1 id="_1">用户组</h1>
<h2 id="_2">前置条件</h2>
<blockquote>
<ol>
<li>用户必须是分级管理员/超级管理员/系统管理员</li>
<li>切换到管理员身份</li>
</ol>
</blockquote>
<p><img alt="image-20210411220815644" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20210411220815644.png" /></p>
<p>用户组是蓝鲸权限中心<strong>推荐</strong>的一种权限管理方式，一个用户组可以添加<strong>多个系统</strong>的权限。</p>
<p>本章节重点介绍用户组的创建、用户组成员管理、用户组权限管理等功能。</p>
<h2 id="_3">新建用户组</h2>
<p>点击<strong>用户组-新建</strong>按钮（如果还没有创建权限模板，可以先创建权限模板）。</p>
<p><img alt="image-20201209192253937" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20201209192253937.png" /></p>
<ul>
<li>
<p>用户组名：<code>必填</code>，全局唯一，为了避免取不好辨识的用户组名，用户组名必须大于 4 个字符。</p>
</li>
<li>
<p>描述：<code>必填</code>，将用户组的功能描述清楚，便于管理员或者用户申请时辨识。</p>
</li>
<li>
<p>添加组成员：<code>非必填</code>，组成员包括用户和组织，权限中心提供组织架构拓扑选择和手动输入两种方式添加成员（手动输入方式只支持用户添加）。成员的添加也可以在用户组列表中找到对应的用户组直接添加。</p>
</li>
</ul>
<p><img alt="image-20200921170621290" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20200921170621290.png" /></p>
<ul>
<li>添加组权限：<code>非必填</code>，选择权限模板或者自定义权限，强烈建议通过添加权限模板的方式授权，方便后续的统一更新维护。</li>
</ul>
<p><img alt="image-20210411221237846" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20210411221237846.png" /></p>
<p>选择模板或者自定义权限后，还需要关联具体的资源实例，选择资源实例后点击<strong>提交</strong>完成用户组的创建。 </p>
<p><img alt="image-20210411221511293" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20210411221511293.png" /></p>
<h2 id="_4">编辑用户组</h2>
<p>编辑用户组涉及组基本信息、用户组权限和成员的变更。</p>
<p><img alt="image-20201209192404971" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20201209192404971.png" /></p>
<ul>
<li>
<p>组基本信息编辑：可以编辑用户组名、组描述信息。</p>
</li>
<li>
<p>组成员编辑：可以删除、添加用户组成员。</p>
</li>
<li>
<p>组权限编辑：切换<strong>组权限</strong>Tab 页，可以添加、删除实例权限。</p>
</li>
</ul>
<p><img alt="image-20210411221757941" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20210411221757941.png" /></p>
<h2 id="_5">删除用户组</h2>
<p>在用户组列表，可以针对用户组直接删除，删除用户组会同时移除组内用户、组内权限，请谨慎操作。</p>
<p><img alt="image-20201209192559031" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Groups/image-20201209192559031.png" /></p><h1 id="_1">管理员设置</h1>
<blockquote>
<p>本文介绍如何设置超级管理员、系统管理员。</p>
</blockquote>
<ul>
<li>超级管理员设置：需要<code>超级管理员</code>身份才能配置，管理超级管理员成员。</li>
<li>系统管理员设置：<code>超级管理员</code>可以设置所有系统的系统管理员，系统管理员只能设置本系统的系统管理员成员。</li>
</ul>
<h2 id="_2">超级管理员设置</h2>
<p>切换<code>超级管理员</code>身份，进入<code>设置-管理员</code>页面，切换到<code>超级管理员</code>tab，点击<code>添加超级管理员</code>，输入用户名后保存即可。</p>
<p>默认超级管理员只有蓝鲸平台的所有授权权限，可以勾选<code>拥有蓝鲸平台的所有操作权限</code>让对应超级管理员同时拥有所有操作权限。</p>
<p><img alt="image-20201029193525009" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Manager/image-20201029193525009.png" /></p>
<h2 id="_3">系统管理员设置</h2>
<p>切换<code>超级管理员</code>或需要设置的对应<code>系统管理员</code>（这里以超级管理员身份介绍），进入<code>设置-管理员</code>页面，切换到<code>系统管理员</code>tab，找到需要更新成员的系统，直接编辑成员列表，即可完成对应管理员的更新。</p>
<p>同样，默认系统管理员只有对应系统的授权权限，可以勾选<code>拥有该系统的所有操作权限</code>让对应系统管理员同时拥有该系统的所有操作权限。</p>
<p><img alt="image-20201029194437908" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Manager/image-20201029194437908.png" /></p><h1 id="_1">审批流程设置</h1>
<p>审批流程设置分审批流程的<code>创建和关联</code>，审批流程<code>创建</code>将在流程服务系统（ITSM）实现，权限中心只需支持审批流程的<code>关联</code>配置。</p>
<h2 id="_2">审批流程创建</h2>
<p>待补充</p>
<h2 id="_3">审批流程关联</h2>
<p>审批流程在 ITSM 创建完成后，在权限中心可以进行审批流程的关联，审批流程的关联操作，不同角色可以关联的配置会有差异。</p>
<ul>
<li>超级管理员：可以配置所有系统的<code>操作权限</code>、超级管理员成员创建的<code>用户组</code>的审批流程关联。</li>
<li>系统管理员：可以配置对应系统的<code>操作权限</code>、对应系统管理员成员创建的<code>用户组</code>的审批流程关联。</li>
<li>分级管理员：可以配置管辖范围内的<code>用户组</code>的审批流程关联。</li>
</ul>
<p>不同的审批场景会自动过滤相应审批角色的审批流程：</p>
<p>自定义权限审批流程：能够关联<strong>不包含</strong><code>分级管理员</code>的审批流程</p>
<p>加入用户组审批流程：能够关联<strong>不包含</strong><code>系统管理员</code>的审批流程</p>
<p>创建分级管理员审批流程：能够关联<strong>不包含</strong><code>系统管理员</code>、<code>分级管理员</code>的审批流程</p>
<h3 id="_4">超级管理员审批流程设置</h3>
<p>点击右上角<strong>个人信息</strong>切换到超级管理员身份，切换成功后，点击菜单<strong>设置 -&gt; 审批流程</strong>进入审批流程设置页面。</p>
<p>超级管理员可以设置对应审批场景的全局的默认审批流程和个性化审批流程。</p>
<p>全局默认审批流程场景包括：自定义权限、加入用户组、创建分级管理员这几类审批场景。</p>
<p>个性化审批流程场景包括：自定义权限审批流程、加入用户组审批流程。</p>
<p>自定义权限审批流程：超级管理员能设置<strong>所有的</strong>自定义权限申请时的审批流程。</p>
<p>加入用户组审批流程：超级管理员能设置<strong>所有的</strong>用户组的审批流程。</p>
<p><img alt="image-20201117094221359" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Approval/image-20201117094221359.png" /></p>
<h3 id="_5">系统管理员审批流程设置</h3>
<p>点击右上角<strong>个人信息</strong>切换到对应系统管理员身份，切换成功后，点击菜单<strong>设置 -&gt; 审批流程</strong>进入审批流程设置页面。</p>
<p>系统管理员可以设置对应审批场景的个性化审批流程。</p>
<p>个性化审批流程场景包括：自定义权限审批流程、加入用户组审批流程。</p>
<p>自定义权限审批流程：系统管理员只能设置属于<strong>本系统</strong>的自定义权限申请时的审批流程。</p>
<p>加入用户组审批流程：系统管理员只能设置属于<strong>本系统</strong>的用户组的审批流程。</p>
<p><img alt="image-20201117095953514" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Approval/image-20201117095953514.png" /></p>
<h3 id="_6">分级管理员审批流程设置</h3>
<p>点击右上角<strong>个人信息</strong>切换到对应分级管理员身份，切换成功后，点击菜单<strong>设置 -&gt; 审批流程</strong>进入审批流程设置页面。</p>
<p>分级管理员可以设置对应审批场景的个性化审批流程。</p>
<p>个性化审批流程场景包括：加入用户组审批流程。</p>
<p>加入用户组审批流程：分级管理员只能设置属于<strong>本分级管理员</strong>创建的用户组的审批流程。</p>
<p><img alt="image-20201117100239755" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品功能/Approval/image-20201117100239755.png" /></p><h1 id="v3-v2">V3 和 V2 的差异？</h1>
<blockquote>
<p>V3 和 V2 的差异仅在蓝鲸企业版中存在，V2 对应蓝鲸企业版2.X，V3 版对应蓝鲸企业版3.X，社区版统一为 V3 版本。</p>
</blockquote>
<p>权限中心 V3 采用了目前业界最强大灵活的的ABAC（Attribute-Based Access Control）模型引擎，融合了 ACL(Access Control List)、RBAC(Role-Based Access Control)、LBAC(Label-Based Access Control)的理念，重新调整优化后的权限模型，使得权限中心在针对海量实例的鉴权时依然可以轻松应对，查询和鉴权性能得到了指数级提升，同时在产品层，对权限的管理删繁就简，聚焦核心场景，更加人性化、更加贴合业务实际需求。</p>
<table><tbody>
<tr><td width="20%">功能</td><td width="40%">V3版</td><td width="40%">V2版</td></tr>
<tr><td width="20%">权限模型</td><td width="40%">ABAC，更灵活更强大，支持更多场景</td><td width="40%">定制版，灵活性较差</td></tr>
<tr><td width="20%">后台优势</td><td width="40%">自研引擎，支持ABAC，查询/鉴权性能，QPS 10000+</td><td width="40%">基于casbin，查询/鉴权性能，QPS 3000+</td></tr>
<tr><td width="20%">权限获得方式</td><td width="40%">三种：加入用户组、继承组织权限、自定义权限，更聚焦</td><td width="40%">四种：加入用户组、权限模板授权、继承组织权限、自定义权限，授权虽然灵活但不好管理</td></tr>
<tr><td width="20%">用户组</td><td width="40%">用户组可以添加权限模板，权限模板和用户组之间没有有效期，用户或者组织加入用户组的时候只存在一个有效期</td><td width="40%">用户组可以添加权限模板，每次添加权限都可以有单独的有效期，用户或者组织加入用户组不需要有效期，存在用户组添加了某些权限，但实际无权限（已过期）的情况</td></tr>
<tr><td width="20%">权限模板</td><td width="40%">权限模板必须关联用户组后才能给用户授权，权限模板和用户组之间存在关联关系，权限模板编辑后可以同步到已关联的用户组</td><td width="40%">权限模板可以单独授权给用户，权限模板和用户组之间不存在关联关系，权限模板编辑后无法同步给已关联的用户组</td></tr>
<tr><td width="20%">权限配置</td><td width="40%">直接选择需要的操作权限，选择实例直接从顶级资源类型开始选择，业务、项目只是顶层的资源类型，无特殊性</td><td width="40%">先选择资源类型，再勾选对应的操作，选择资源实例时需要先选择内置的资源范围：业务、项目，在选择具体的资源实例</td></tr>
<tr><td width="20%">二级权限管理</td><td width="40%">v3版推出了分级管理员功能，支持任意资源范围的授权能力，小可以是一个实例的权限管理员，大可以是所有资源实例的权限管理员</td><td width="40%">无</td></tr>
<tr><td width="20%">超级管理员</td><td width="40%">内置角色，只需要简单配置即可，默认仅拥有所有接入系统的授权权限，通过配置可以拥有所有资源权限，无需被授权，直接通过角色鉴权</td><td width="40%">一个特殊的用户组，仍需要通过用户组的权限来鉴权</td></tr>
<tr><td width="20%">系统管理员</td><td width="40%">内置角色，只需要简单配置即可，默认仅拥有对应系统的授权权限，通过配置可以拥有对应系统的资源全能型，对应系统权限无需被授予，可以授予其他系统权限，直接通过角色鉴权</td><td width="40%">一个特殊的用户组，仍需要通过用户组的权限来鉴权</td></tr>
<tr><td width="20%">admin</td><td width="40%">内置超级管理员角色，默认拥有所有接入系统的授权权限和资源权限</td><td width="40%">默认被加入到超级管理员用户组里，默认拥有所有接入系统的授权权限和资源权限</td></tr>
<tr><td width="20%">系统接入</td><td width="40%">SDK支持（Python/Go语言版本已开源）</td><td width="40%">无SDK支持</td></tr>
<tr><td width="20%">实例存储方式</td><td width="40%">分布式存储，资源实例只有在用户配置实例权限时从接入系统拉取，权限中心不单独存储实例数据</td><td width="40%">集中式存储，资源实例统一集中存储到权限中心</td></tr>
<tr><td width="20%">鉴权方式</td><td width="40%">分布式鉴权，权限中心仅存储策略表达式，具体鉴权逻辑需要接入系统自行解析比对</td><td width="40%">集中式鉴权，权限中心负责解析和鉴权所有实例</td></tr>
<tr><td width="20%">实例选择方式</td><td width="40%">拓扑视图选择，支持任意层级资源的选择，支持同一个资源类型的多种实例视图选择</td><td width="40%">支持嵌套的列表选择，同一个资源类型仅支持单个拓扑选择</td></tr>
<tr><td width="20%">组织架构授权</td><td width="40%">组织只有加入到用户组才能被授权</td><td width="40%">组织可以直接被权限模板授权</td></tr>
<tr><td width="20%">权限策略</td><td width="40%">以操作为导向鉴权</td><td width="40%">以资源为导向鉴权</td></tr>
<tr><td width="20%">SDK</td><td width="40%">支持Java、python、Go，其中Python、Go已开源</td><td width="40%">无</td></tr>
<tr><td width="20%">审批流程</td><td width="40%">目前支持上级审批、分级管理员审批、系统管理员审批、超级管理员审批、指定审批人审批</td><td width="40%">支持上级审批、资源审批人审批、超级管理员审批、系统管理员审批、指定审批人审批</td></tr>
<tr><td width="20%">个人权限所有权限</td><td width="40%">用户组权限 + 自定义权限</td><td width="40%">我的权限</td></tr>
<tr><td width="20%">最佳实践</td><td width="40%">分级管理员 + 用户组</td><td width="40%">无</td></tr>
<tr><td width="20%">资源之间关系</td><td width="40%">资源之间默认独立注册，通过实例视图建立关联关系，业务、项目只是其中一类层级资源</td><td width="40%">资源之间默认从属关系，其中业务、项目、全局为资源隔离范围</td></tr>
<tr><td width="20%">操作与资源关系</td><td width="40%">操作、资源类型是关联关系，解耦</td><td width="40%">操作从属于某个资源类型，完全耦合</td></tr>
</tbody></table><h1 id="_1">权限中心有推荐的最佳实践吗？</h1>
<p>权限中心能够支持到实例级别授权，但并不是说权限管理也一定要走一条条实例授权，我们推荐最佳实践是 <strong>分级管理员 + 用户组</strong> 的权限管理方式。</p>
<p>最佳实践详情参考<a href="../场景案例/GradingManager.md">场景案例</a>。</p><h1 id="_1">支持跨部门或者业务的管理权限吗？</h1>
<p>支持，权限控制很灵活，可以按组织架构授权，也可以按个人，按业务授权等。</p>
<p>V3 版权限中心没有特殊处理业务、项目的概念，而是把业务、项目作为资源实例选择的其中一个层级的节点资源，很方便的适应了，按业务、项目等资源隔离范围等场景授权，勾选某个业务节点，就拥有了对应业务下任意实例的权限，满足动态赋权的需求。</p>
<p><img alt="image-20210322215637372" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/常见问题/Orggrants/image-20210322215637372.png" /></p>
<p>权限中心支持组织架构权限管理，管理员只需要将某个组织加入到用户组，整个组织以及子组织的用户都拥有了对应用户组的权限，而且组织后期变动的人员也自动失去或拥有用户组的权限，满足动态人员授权需求。</p>
<p><img alt="image-20210322220057205" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/常见问题/Orggrants/image-20210322220057205.png" /></p>
<p><img alt="image-20210322220403954" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/常见问题/Orggrants/image-20210322220403954.png" /></p><h1 id="_1">权限中心支持属性授权吗？</h1>
<p>支持，但这个需要接入的系统本身支持属性筛选实例的功能实现，目前蓝鲸官方系统支持属性授权的有：标准运维，后期迭代会有更多的接入系统支持属性授权。</p>
<p><img alt="image-20210322212344234" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/常见问题/Attribute/image-20210322212344234.png" /></p><h1 id="_1">如何接入权限中心</h1>
<p>权限中心支持基于蓝鲸开发框架开发的SaaS接入，也支持企业第三方系统的接入，接入系统无需再单独实现权限控制模块，只需要实现少量业务逻辑代码即可，减少核心基础功能的重复开发和人力投入。</p>
<p>详情参考 <a href="../../../iam_dev_docs/QuickStart/01-Begin.md">系统接入开发指引</a>。</p>
<p><img alt="image-20201110095219983" src="F:\v_awjliu\BKDocs\ZH/6.0/权限中心/产品白皮书/产品简介/README/image-20201110095219983.png" /></p><h1 id="api-esb-api">后台 API 和 ESB API 说明</h1>
<h2 id="_1">背景</h2>
<p>由于高性能的 APIGateway2.0 尚未发布企业版, 所以为了性能考虑, 模型/策略/鉴权等接口目前没有接入 ESB, 直接后台 API 调用; 而 SaaS 上无权限申请/授权接口等, 接入了 ESB</p>
<p>目前权限中心提供的接口分为两类:
1. 后台 API, URL 前缀: <code>/api/v1/[model | policy | systems]</code>
    1.1 model <a href="../02-Model/00-API.md">模型注册及更新 API</a>
    1.2 policy <a href="../04-Auth/01-SDK.md">策略查询 API</a> / <a href="../04-Auth/02-DirectAPI.md">直接鉴权 API</a>
    1.3 systems 系统相关  <a href="../08-Query/01-PolicyGet.md">查询策略 API</a>
2. 组件 API, URL 前缀: <code>/api/c/compapi/v2/iam/[application | authorization]</code>
    1.1  application <a href="../05-Application/01-GenerateURL.md">5. 生成无权限申请 URL</a>
    1.2  authorization <a href="../07-ResourceCreatorAction/01-Attribute.md">新建关联属性授权接口</a>
    1.3 authorization <a href="../06-GrantRevoke/01-Topology.md">资源拓扑授权/回收</a></p>
<p>未来, APIGateway 2.0 企业版发布后, 会全部统一接入 APIGateway, 对于接入系统来说, 就是一套系统, 一种调用方式.</p>
<h2 id="api">后台 API</h2>
<p>直接调用 IAM 后台 API, 请仔细阅读 <a href="./02-APIBasicInfo.md">接口协议前置说明</a> 中对 request header/body 以及 response 的说明</p>
<p>调用地址:
- 如果是企业版 SaaS, 直接通过环境变量获取: <code>BK_IAM_V3_APP_CODE</code> (权限中心 SaaS 的 app_code, 用于跳转到权限中心的 URL 拼接) / <code>BK_IAM_V3_INNER_HOST</code>(权限中心后台的访问地址)
- 如果是非 SaaS 的其他平台, 需要部署时渲染 <code>__BKIAM_HOST__:__BKIAM_PORT__</code></p>
<p>相关链接:
- <a href="../../../HowTo/FAQ/ErrorCode.md">后台接口错误码说明</a></p>
<h2 id="esb-api">ESB API</h2>
<p>需要遵守企业版 ESB 的接口协议. eedev 联调环境, 可以通过 <code>https://{PAAS_DOMAIN}/esb/api_docs/system/IAM/</code> 查看权限中心接入 ESB 的具体文档</p>
<p>ESB 调用地址:
- 如果是企业版 SaaS, 使用 ESB SDK 调用,   API 调用说明 <code>https://{PAAS_DOMAIN}/esb/guide/page/use_component</code>
- 如果是企业版 SaaS, 直接通过 http 访问, 可以通过环境变量获取: <code>BK_PAAS_INNER_HOST</code>即 PaaS 的内网域名, 拼接<code>{BK_PAAS_INNER_HOST}/api/c/compapi/v2/iam/</code>
- 如果是非企业版 SaaS 的其他平台, 请使用 PaaS 内网地址或域名访问组件 <code>{PAAS_DOMAIN}/api/c/compapi/v2/iam/</code>. </p><h2 id="_1">接口协议前置说明</h2>
<p>Request Header:</p>
<ul>
<li><code>X-Bk-App-Code</code>   蓝鲸应用 app_code</li>
<li><code>X-Bk-App-Secret</code>  蓝鲸应用 app_secret</li>
<li><code>X-Bk-IAM-Version</code> IAM Policy 协议版本号, 不传默认为 1. (只有鉴权/策略相关的接口涉及, 暂时不需要关注)</li>
</ul>
<p>Response Header:
-  <code>X-Request-Id</code>  请求 request_id, 请记录, 用于错误排查</p>
<p>Response Body: 遵循蓝鲸官方 API 协议进行返回, <code>code != 0</code> 表示出错, <code>message</code>包含具体信息</p>
<pre class="codehilite"><code class="language-bash">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
    }
}</code></pre>


<p><strong>重要</strong>: 调用权限中心 API 都会返回一个<code>request_id</code>, 请在日志中记录, 以便后续联调及正式环境中进行问题排查; </p>
<hr />
<h2 id="resources">接口协议中<code>resources</code>字段说明</h2>
<p>Request 的 json body 中<code>resources</code></p>
<blockquote>
<p><code>resources</code>是一个列表
<code>resources</code>代表<code>一个资源</code></p>
</blockquote>
<p>如果是独立系统, 那么<code>resources</code>只有一个 item</p>
<pre class="codehilite"><code class="language-json">    &quot;resources&quot;: [
    {
        &quot;system&quot;: &quot;bk_paas&quot;,
        &quot;type&quot;: &quot;app&quot;,
        &quot;id&quot;: &quot;bk_framework&quot;
    }]</code></pre>


<p>如果是跨系统资源依赖, 那么<code>resources</code>有多个 item, 包含跨系统依赖资源, 例如 job 脚本是否有在 cmdb 某个主机上的执行权限</p>
<pre class="codehilite"><code class="language-json">    &quot;resources&quot;: [
    {
        &quot;system&quot;: &quot;bk_job&quot;,
        &quot;type&quot;: &quot;script&quot;,
        &quot;id&quot;: &quot;run&quot;
    },
    {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;id&quot;: &quot;192.168.1.1&quot;
    }]</code></pre>


<p>所以, 写批量接口批量确认一批资源权限
- <code>resources</code>表示一个资源, 类型是 <code>[resource,]</code>
- <code>resources_list</code>表示一批资源, 类型是 <code>[resources, resources]</code> 即, <code>[ [resource,],  [resource,], ]</code></p><h1 id="_1">系统间接口鉴权</h1>
<h2 id="-">接入系统 -&gt; 权限中心</h2>
<h3 id="1">1. 场景</h3>
<ol>
<li>模型注册 (<a href="../02-Model/00-API.md">模型注册接口协议</a>)</li>
<li>拉取策略/鉴权 (<a href="../04-Auth/01-SDK.md">SDK 鉴权接口协议</a>)</li>
</ol>
<h3 id="2">2. 鉴权逻辑</h3>
<p>使用蓝鲸 app_code/app_secret 进行鉴权 </p>
<p>Request Header:</p>
<pre class="codehilite"><code class="language-bash">X-Bk-App-Code 蓝鲸应用app_code
X-Bk-App-Secret 蓝鲸应用app_secret</code></pre>


<p>没有权限将返回:</p>
<pre class="codehilite"><code class="language-bash">status: 200
response_body:
# 没有提供app_code/app_secret
{
    &quot;code&quot;: 1901401,
    &quot;message&quot;: &quot;unauthorized: app code and app secret required&quot;,
    &quot;data&quot;: {}
}
# app_code或app_secret错误
{
    &quot;code&quot;: 1901401,
    &quot;message&quot;: &quot;unauthorized: app code or app secret wrong&quot;,
    &quot;data&quot;: {}
}</code></pre>


<hr />
<h2 id="-_1">权限中心 -&gt; 接入系统</h2>
<p>接入系统暴露的接口是可以查询资源实例/属性等信息的, 可能包含敏感信息, 所以需要对权限中心资源拉取接口做鉴权.</p>
<h3 id="1_1">1. 场景</h3>
<p>资源拉取 (<a href="../03-Callback/01-API.md">资源拉取接口协议</a>)</p>
<h3 id="2_1">2. 鉴权逻辑</h3>
<p><strong>注意</strong>: 目前只支持<code>none</code>或<code>basic</code>, 相对复杂的<code>digest</code>/<code>signature</code>规划中</p>
<ol>
<li>注册系统时(<a href="../02-Model/10-System.md">新增系统接口协议</a>), 需要确定鉴权方式: <code>none</code>/<code>basic</code>/<code>digest</code>/<code>signature</code> </li>
<li>系统注册成功, 会生成一个<code>token</code></li>
<li>当权限中心调用<code>接入系统</code>的时候, 会根据接入系统注册的鉴权方式和上一步生成的 token, 生成对应的请求, 然后调用<code>接入系统</code></li>
<li>接入系统需要根据注册系统选择的鉴权方式, 对权限中心发过来的请求进行鉴权.</li>
</ol>
<p><strong>鉴权方式:</strong>
- <code>none</code>: 不鉴权, 意味着所有资源拉取接口没有权限控制(<a href="../03-Callback/01-API.md">资源拉取接口协议</a>). <code>不推荐, 可以在测试联调时使用</code>
- <code>basic</code>: http basic auth, 权限中心调用接入系统, 生成 header<code>Authorization: Basic base64(username:password)</code> (其中<code>username=bk_iam, password={token}</code>), <code>接入系统</code>解析请求后, 要使用 token 进行鉴权.  <code>推荐, 同蓝鲸体系部署在同一个内网的服务</code> - 已支持
- <code>digest</code>: http digest auth, 权限中心调用接入系统, 使用摘要算法生成 header<code>Authorization: Digest xxxx</code>, <code>接入系统</code>解析请求后, 需要使用 token 进行鉴权. <code>同蓝鲸体系部署在同一个内网的服务, 对安全性进一步需求的服务(实现方和调用方的逻辑较为复杂, 出问题不好调试)</code> - 暂不支持
- <code>signature</code>: 使用签名算法, 生成 header<code>X-Bk-IAM-Signature: xxx</code> (尚未确认协议). <code>接入系统</code>解析请求后, 需要使用 token 进行鉴权. <code>外网服务或对安全性有很高要求的服务</code>- 暂不支持</p>
<p><code>接入系统</code>解析请求后, 需要使用 token 进行鉴权:</p>
<ul>
<li>使用<code>app_code/app_secret</code>到权限中心查询<code>token</code> (<a href="../02-Model/16-Token.md">查询 token 协议</a>) (建议, 查询回来后缓存起来)</li>
</ul><h1 id="api">模型注册 API</h1>
<ul>
<li><a href="./00-Concepts.md">名词及概念</a></li>
<li><a href="./10-System.md">系统 System</a></li>
<li><a href="./11-ResourceType.md">资源类型 ResourceType</a></li>
<li><a href="./12-InstanceSelection.md">实例视图 InstanceSelection</a></li>
<li><a href="./13-Action.md">操作 Action</a></li>
<li><a href="./14-ActionGroup.md">操作组 ActionGroup</a></li>
<li><a href="./15-CommonQuery.md">通用查询 Common Query</a></li>
<li><a href="./16-Token.md">系统 token 查询</a></li>
<li><a href="./17-CommonActions.md">常用操作配置 CommonActions</a></li>
<li><a href="./18-FeatureShieldRules.md">功能开关配置 FeatureShieldRules</a></li>
<li><a href="./19-ResourceCreatorAction.md">新建关联配置 ResourceCreatorAction</a></li>
</ul><h1 id="_1">名词及概念</h1>
<p>说明: 1. 概念 2.限制(例如正则校验/非空/全局唯一等等)</p>
<blockquote>
<p>所有更新(<code>PUT</code>)操作, 如果传了<code>key</code>并给了<code>空值</code>, 那么执行的是<code>置空操作</code>; 如果没有传<code>key</code>, 表示不更新该字段</p>
</blockquote>
<h2 id="1-system-saas">1. System: 接入权限中心的 SaaS 或平台或第三方系统</h2>
<ul>
<li>id: 系统的唯一标识，可直接使用 app_code 的值作为唯一标识，但 app_code 还用于接口的认证，值可以一样，但需支持 id 和 app_code 可单独配置不一样的，同时对于 cmdb 这种被依赖的系统，需要保证所有版本的系统 ID 都一样；只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-)， 最长 32 个字符。</li>
<li>name: 系统名称，注册时权限中心不允许与已存在系统同名</li>
<li>name_en: 系统英文名，国际化时切换到英文版本显示</li>
<li>description:  系统描述</li>
<li>description_en: 系统描述描述英文, 国际化切换到英文版本展示</li>
<li>clients： 有权限调用权限中心获取或操作该系统权限相关数据的客户端列表，即 app_code list，多个使用英文逗号分隔， 比如 BCS 由一个客户端 bk_bcs 注册，但是需要多个客户端（bk_bcs,bk_bcs_app,bk_devops,bk_harbor）都可以调用鉴权接口进行该系统的鉴权 </li>
<li>provider_config.host：权限中心回调接入系统时需要的配置文件，权限中心需要调用接入系统拉取资源实例接口，所以需要接入系统 API 的 HOST, HOST 格式：scheme://netloc，与 resource_type.provider_config.path 配合使用. <code>例如system.provider_config.host=http://cmdb.consul, resource_type.provider_config.path=/api/v1/resources</code>, 那么将调用<code>http://cmdb.consul/api/v1/resources</code>去拉取该资源类型相关信息</li>
<li>provider_config.auth: 权限中心调用接入系统吸取资源信息需要用的的接口鉴权方法, 目前支持<code>none/basic</code>, (<code>digest/signature</code>规划中), 接入系统需要实现相应的鉴权逻辑, 确保是合法的 iam 请求. <a href="../01-Overview/03-APIAuth.md">系统间调用接口鉴权:权限中心-&gt;接入系统</a></li>
<li>provider_config.healthz: 权限中心调用接入系统的 healthz 检查系统是否健康; 与 provider_config.host 配合使用, <code>例如system.provider_config.host=http://cmdb.consul, provider_config.healthz=/healthz/</code>, 那么将调用<code>http://cmdb.consul/healthz/</code>检查系统是否健康. </li>
</ul>
<hr />
<h2 id="2-resourcetype">2. ResourceType: 操作对象的资源类别</h2>
<ul>
<li>id: 资源类型的唯一标识，接入系统下唯一，只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-)，最长 32 个字符。</li>
<li>name: 资源类型名称，系统下唯一</li>
<li>name_en:  资源类型英文名，国际化时切换到英文版本显示</li>
<li>description: 资源类型描述</li>
<li>description_en: 资源类型描述英文, 国际化切换到英文版本展示</li>
<li>parents: 资源类型的直接上级，可多个直接上级，可以是自身系统的资源类型或其他系统的资源类型, 可为空列表，不允许重复，数据仅用于权限中心产品上显示  </li>
<li>provider_config: 权限中心调用查询资源实例接口需要的配置文件，包括权限中心调用查询资源实例接口的 URL 的 path，与 system.provider_config.host 配合使用. <code>例如system.provider_config.host=http://cmdb.consul, resource_type.provider_config.path=/api/v1/resources</code>, 那么将调用<code>http://cmdb.consul/api/v1/resources</code>去拉取该资源类型相关信息</li>
</ul>
<hr />
<h2 id="3-instanceselection">3. InstanceSelection: 实例视图</h2>
<ul>
<li>id: 实例视图的唯一标识，接入系统下唯一，只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-)，最长 32 个字符。</li>
<li>name: 实例视图名称，系统下唯一</li>
<li>name_en:  实例视图英文名，国际化时切换到英文版本显示</li>
<li>resource_type_chain：实例视图包含的资源类型的层级链路</li>
<li>is_dynamic：是否是动态拓扑视图，<code>默认为false</code>，如果是动态拓扑视图, 需要在<code>list_instance</code>中实现<code>child_type</code>来拉取到下一级的资源类型, <a href="../03-Callback/12-list_instance.md">具体参考</a><ul>
<li>使用动态拓扑视图的所有下级资源类型的系统 id 必须与 root 节点的系统 id 相同, 不能出现系统 id 不同的情况, 会导致配置出错误的权限</li>
<li>使用动态拓扑视图时, 权限中心不会校验用户提交的数据是否与视图匹配, 并且在创建依赖操作时, 如果发现是动态拓扑视图, 不会产生依赖操作</li>
</ul>
</li>
</ul>
<hr />
<h2 id="4-action">4. Action: 权限操作，比如增删改查</h2>
<ul>
<li>id: 操作的唯一标识，接入系统下唯一，只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-)，最长 32 个字符。</li>
<li>name: 操作名称，系统下唯一</li>
<li>name_en:  操作英文名，国际化时切换到英文版本显示</li>
<li>description: 操作描述</li>
<li>description_en: 描述英文, 国际化切换到英文版本展示</li>
<li>type: 操作的类型，枚举值包括<code>create\delete\view\edit\list\manage\execute</code> 比如创建类操作需要标识为"create"，无法分类可为空字符串，目前权限中心仅仅对创建类操作有相关处理</li>
<li>related_actions: related_actions: 操作的依赖操作，当用户申请的操作权限必须依赖其他操作权限（暂不支持跨系统操作关联）时，比如用户申请 作业编辑，必须依赖 作业查看 的操作权限，作业查看 就是 作业编辑 的依赖操作。在产品层表现就是：当用户勾选 作业编辑 时，系统在创建申请单时，会自动申请 作业查看 权限。 </li>
<li>related_resource_types： 操作的对象资源类型列表，列表顺序与产品展示、鉴权校验 顺序 必须保持一致 <a href="../../../../权限中心/产品白皮书/术语解释/Trem.md#依赖资源">产品说明: 依赖资源</a><ul>
<li>system_id： 资源类型的来源系统，可以是自身系统或其他系统</li>
<li>scope：限制该操作对该资源的选择范围，条件表达式协议: <a href="../..//Expression/01-Schema.md">协议详情</a> <a href="../../../../权限中心/产品白皮书/术语解释/Trem.md#资源范围">产品说明: 资源范围</a></li>
<li>selection_mode: 选择类型, 即资源在权限中心产品上配置权限时的作用范围<ul>
<li>等于<code>instance</code>, 仅可选择实例, <code>默认值</code></li>
<li>等于<code>attribute</code>, 仅可配置属性, 此时<code>instance_selections</code>配置不生效</li>
<li>等于<code>all</code>, 可以同时选择实例和配置属性</li>
</ul>
</li>
<li>related_instance_selections：关联的实例视图，可以关联本系统定义的实例视图, 也可以配置其他系统定义的(如果<code>selection_mode=attribute</code>不用配置该字段). 该字段的功能表现在权限中心产品上配置权限时的实例选择方式 <a href="../../../../权限中心/产品白皮书/术语解释/Trem.md#实例视图">产品说明: 实例选择视图</a><ul>
<li>system_id：实例视图的系统</li>
<li>id：实例视图的 ID</li>
<li>ignore_iam_path：是否忽略路径，<code>默认为false</code>，在 IAM 产品上选择实例视图配置权限的资源时，<strong>如果选到 Action 关联的资源类型实例，而不是上级或祖先（选择了中间节点，ignore_iam_path 是不起作用的）</strong>，那么对于<code>ignore_iam_path=true</code>时权限保存类似：<code>id=192.168.1.1</code>，若<code>ignore_iam_path=false</code>时则权限保存类似：<code>id=192.168.1.1 AND _bk_iam_path_= /biz,1/set,2/module,3/</code><ul>
<li>ignore_iam_path 由 false 变更为 true 时，已配置的权限（类似：<code>id=192.168.1.1 AND _bk_iam_path_= /biz,1/set,2/module,3/</code>）将无法通过 id 直接通过鉴权</li>
<li>ignore_iam_path 由 true 变更为 false 时，已配置的权限（类似：<code>id=192.168.1.1</code>）无论任何路径都可以通过鉴权</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr />
<h2 id="5-version">5.版本号 version</h2>
<ul>
<li>仅仅作为在权限中心产品上进行 New 的更新提醒。<a href="../../../../权限中心/产品白皮书/术语解释/Trem.md#版本">产品说明：版本号</a></li>
<li>对于 ResourceType，对比该系统的所有 ResourceType 的 Version，最大的 version 将在产品上显示 New 的提示</li>
<li>对于 Action，对比该系统的所有 Action 的 Version，最大的 version 将在产品上显示 New 的提示</li>
</ul><h1 id="system-api">系统 System API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统 id, 全局唯一, 只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-), 最长 32 个字符.</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统名称，全局唯一</td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统英文名，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">description</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">系统描述，全局唯一</td>
</tr>
<tr>
<td align="left">description_en</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">系统描述英文，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">clients</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">有权限调用的客户端，即有权限调用的 app_code 列表，多个使用英文逗号分隔，注册系统时会校验 Header 头里的 app_code 必须在列表里 <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
<tr>
<td align="left">provider_config</td>
<td align="left">Object</td>
<td align="left">是</td>
<td align="left">权限中心回调接入系统的配置文件 <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
</tbody>
</table>
<p>provider_config 内元素 参数：</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">host</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">权限中心调用查询资源实例接口的 HOST，格式：scheme://netloc，与 resource_type.provider_config.path 配合使用</td>
</tr>
<tr>
<td align="left">auth</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">权限中心调用查询资源实例接口的鉴权方式, 当前可选: <code>none</code>/<code>basic</code>, 详细说明文档 <a href="../01-Overview/03-APIAuth.md">系统间调用接口鉴权:权限中心-&gt;接入系统</a></td>
</tr>
<tr>
<td align="left">healthz</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">权限中心调用接入系统的 healthz 检查系统是否健康; 与 provider_config.host 配合使用, <code>例如system.provider_config.host=http://cmdb.consul, provider_config.healthz=/healthz/</code>, 那么将调用<code>http://cmdb.consul/healthz/</code>检查系统是否健康.</td>
</tr>
</tbody>
</table>
<h3 id="1-system">1. 新增 system</h3>
<p>注意: </p>
<ul>
<li>一个 app_code 只能创建一个 system, 且 system_id 必须等于 app_code; 如果不符合要求, 接口返回 <code>1901400 bad request:system_id should be the app_code!</code></li>
<li>创建 system 时如果没有把自己加入 clients, 会自动将当前发起<code>新增system</code>的 app_code 加入<code>clients</code></li>
</ul>
<hr />
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/v1/model/systems</p>
</blockquote>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;id&quot;: &quot;bk_cmdb&quot;,
    &quot;name&quot;: &quot;配置平台&quot;,
    &quot;name_en&quot;: &quot;CMDB&quot;,
    &quot;description&quot;: &quot;配置平台是一个...&quot;,
    &quot;description_en&quot;: &quot;CMDB is a...&quot;,
    &quot;clients&quot;: &quot;bk_cmdb,cmdb&quot;,
    &quot;provider_config&quot;: {
        &quot;host&quot;: &quot;http://cmdb.service.consul&quot;,
        &quot;auth&quot;: &quot;basic&quot;,
        &quot;healthz&quot;: &quot;/api/v1/healthz&quot;
    }
}</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        &quot;id&quot;: &quot;bk_cmdb&quot;
    }
}</code></pre>


<h3 id="2-system">2. 更新 system</h3>
<p><code>路径中system_id是唯一标识; body中只需要传入要更新的字段, 其中对于provider_config是全覆盖更新，不支持只更新provider_config中某个字段</code></p>
<p>注意: 
- 更新 system 时如果没有把自己加入 clients, 会自动将当前发起<code>更新system</code>的 app_code 加入<code>clients</code>(即, 更新发起者无法将自己移除<code>clients</code>)</p>
<h4 id="url_1">URL</h4>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request_1">Request</h4>
<p><code>json
{
    "name": "配置平台",
    "name_en": "CMDB",
    "clients": "bk_cmdb,cmdb",
    "provider_config": {
        "host": "http://cmdb_new.service.consul"
    }
}</code></p>
<h4 id="response_1">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="resourcetype-api">资源类型 ResourceType API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型 id, 系统下唯一, 只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-),最长 32 个字符.</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型名称，系统下唯一</td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型英文名，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">description</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">资源类型名称，系统下唯一</td>
</tr>
<tr>
<td align="left">description_en</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">资源类型英文名，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">parents</td>
<td align="left">Array[Object]</td>
<td align="left">否</td>
<td align="left">资源类型的直接上级，可多个直接上级，可以是自身系统的资源类型或其他系统的资源类型, 可为空列表，不允许重复，数据仅用于权限中心产品上显示</td>
</tr>
<tr>
<td align="left">provider_config</td>
<td align="left">Object</td>
<td align="left">是</td>
<td align="left">权限中心调用查询资源实例接口的配置文件，与 system.provider_config.host 配合使用 <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
<tr>
<td align="left">version</td>
<td align="left">int</td>
<td align="left">否</td>
<td align="left">版本号，允许为空，仅仅作为在权限中心上进行 New 的更新提醒  <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
</tbody>
</table>
<p>parents 元素参数说明</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">直接上级资源类型的来源系统 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">直接上级资源类型 ID</td>
</tr>
</tbody>
</table>
<p>provider_config 内元素 参数：</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">path</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">权限中心调用查询资源实例接口的 URL 的 PATH，与 system.provider_config.host 配合使用</td>
</tr>
</tbody>
</table>
<h3 id="1-resourcetype">1. 新增 resourceType</h3>
<p>限制:
- 一个系统只能创建最多 50 个 resourceType</p>
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/resource-types</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;biz_set&quot;,
        &quot;name&quot;: &quot;业务集&quot;,
        &quot;name_en&quot;: &quot;biz_set&quot;,
        &quot;description&quot;: &quot;业务集是...&quot;,
        &quot;description_en&quot;: &quot;biz_set is a ...&quot;,
        &quot;parents&quot;: [],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/biz_set/query&quot;
        },
        &quot;version&quot;: 1
    },
    {
        &quot;id&quot;: &quot;biz&quot;,
        &quot;name&quot;: &quot;业务&quot;,
        &quot;name_en&quot;: &quot;biz&quot;,
        &quot;description&quot;: &quot;业务是...&quot;,
        &quot;description_en&quot;: &quot;biz is a ...&quot;,
        &quot;parents&quot;: [
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz_set&quot;}            
        ],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/biz/query&quot;
        },
        &quot;version&quot;: 1
    },
    {
        &quot;id&quot;: &quot;dir&quot;, 
        &quot;name&quot;: &quot;目录&quot;,
        &quot;name_en&quot;: &quot;dir&quot;, 
        &quot;description&quot;: &quot;目录是...&quot;,
        &quot;description_en&quot;: &quot;dir is a ...&quot;,
        &quot;parents&quot;: [
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz&quot;}
        ],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/dir/query&quot;
        },
        &quot;version&quot;: 1
    },  
    {
        &quot;id&quot;: &quot;set&quot;, 
        &quot;name&quot;: &quot;集群&quot;,
        &quot;name_en&quot;: &quot;set&quot;, 
        &quot;description&quot;: &quot;集群是...&quot;,
        &quot;description_en&quot;: &quot;set is a ...&quot;,
        &quot;parents&quot;: [
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz&quot;},
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;dir&quot;}
        ],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/set/query&quot;
        },
        &quot;version&quot;: 1
    },
    {
        &quot;id&quot;: &quot;module&quot;, 
        &quot;name&quot;: &quot;模块&quot;,
        &quot;name_en&quot;: &quot;module&quot;, 
        &quot;description&quot;: &quot;模块是...&quot;,
        &quot;description_en&quot;: &quot;module is a ...&quot;,
        &quot;parents&quot;: [
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;set&quot;}
        ],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/module/query&quot;
        },
        &quot;version&quot;: 1
    },
    {
        &quot;id&quot;: &quot;host&quot;, 
        &quot;name&quot;: &quot;主机&quot;,
        &quot;name_en&quot;: &quot;host&quot;, 
        &quot;description&quot;: &quot;主机是...&quot;,
        &quot;description_en&quot;: &quot;host is a ...&quot;,
        &quot;parents&quot;: [
            {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;module&quot;}
        ],
        &quot;provider_config&quot;: {
            &quot;path&quot;: &quot;/api/v1/resources/host/query&quot;
        },
        &quot;version&quot;: 1
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="2-resourcetype">2. 修改 resourceType</h3>
<h4 id="url_1">URL</h4>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/resource-types/{resource_type_id}</p>
</blockquote>
<h4 id="parameters_1">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">resource_type_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">资源类型 ID</td>
</tr>
</tbody>
</table>
<h4 id="request_1">Request</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;name&quot;: &quot;业务新&quot;,
    &quot;name_en&quot;: &quot;biz new&quot;,
    &quot;description&quot;: &quot;业务新...&quot;,
    &quot;description_en&quot;: &quot;biz new is ....&quot;,
    &quot;provider_config&quot;: {
        &quot;path&quot;: &quot;/api/v2/resources/biz/query&quot;
    },
    &quot;version&quot;: 2
}</code></pre>


<h4 id="response_1">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="3-resourcetype">3. 删除 resourceType</h3>
<p>必须同时满足以下两个条件才能成功删除资源类型
1. 该资源类型不作为其他的上级资源，具体遍历所有资源类型的 parents 是否存在该资源类型
2. 该资源类型不作为 Action 的操作对象资源类型，具体遍历所有 Action 的 related_resource_types 是否存在该资源类型</p>
<h4 id="url_2">URL</h4>
<p>批量删除 (需要 Request.Body)</p>
<blockquote>
<p>DELETE /api/v1/model/systems/{system_id}/resource-types</p>
</blockquote>
<p>单个删除 (不需要 Request.Body)</p>
<blockquote>
<p>DELETE /api/v1/model/systems/{system_id}/resource-types/{resource_type_id}</p>
</blockquote>
<h4 id="parameters_2">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">resource_type_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">check_existence</td>
<td align="left">boolean</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">默认会检查 id 存在, 不存在将导致删除失败,  设置 false 不检查 id 是否存在, 直接走删除(<code>delete from table where id in []</code>)</td>
</tr>
</tbody>
</table>
<h4 id="request_2">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;biz&quot;
    },
    {
        &quot;id&quot;: &quot;set&quot;
    }
]</code></pre>


<h4 id="response_2">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="instanceselection-api">实例视图 InstanceSelection API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">实例视图 id, 系统下唯一, 只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-),最长 32 个字符.</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">实例视图名称，系统下唯一</td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">实例视图的英文名，国际化时切换到英文版本显示，系统下唯一</td>
</tr>
<tr>
<td align="left">is_dynamic</td>
<td align="left">bool</td>
<td align="left">否</td>
<td align="left">是否是动态拓扑视图，<code>默认为false</code>，<a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
<tr>
<td align="left">resource_type_chain</td>
<td align="left">Array(Object)</td>
<td align="left">是</td>
<td align="left">资源类型的层级链路</td>
</tr>
</tbody>
</table>
<p>resource_type_chain 里的元素 </p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型的来源系统 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
</tbody>
</table>
<h3 id="1-instanceselection">1. 新增 instanceSelection</h3>
<p>限制:
- 一个系统只能创建最多 50 个 instanceSelection</p>
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/instance-selections</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;free_host&quot;,
        &quot;name&quot;: &quot;空闲主机&quot;,
        &quot;name_en&quot;: &quot;free host&quot;,
        &quot;resource_type_chain&quot;: [{
            &quot;system_id&quot;: &quot;bk_cmdb&quot;,
            &quot;id&quot;: &quot;host&quot;
        }]
    },
    {
        &quot;id&quot;: &quot;biz_topology&quot;,
        &quot;name&quot;: &quot;业务拓扑&quot;,
        &quot;name_en&quot;: &quot;biz topology&quot;,
        &quot;resource_type_chain&quot;: [{
                &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                &quot;id&quot;: &quot;biz&quot;
            },
            {
                &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                &quot;id&quot;: &quot;set&quot;
            },
            {
                &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                &quot;id&quot;: &quot;module&quot;
            },
            {
                &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                &quot;id&quot;: &quot;host&quot;
            }
        ]
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="2-instanceselection">2. 修改 instanceSelection</h3>
<h4 id="url_1">URL</h4>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/instance-selections/{instance_selection_id}</p>
</blockquote>
<h4 id="parameters_1">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">instance_selection_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">实例视图 ID</td>
</tr>
</tbody>
</table>
<h4 id="request_1">Request</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;id&quot;: &quot;free_host1&quot;,
    &quot;name&quot;: &quot;空闲主机1&quot;,
    &quot;name_en&quot;: &quot;free host1&quot;,
    &quot;resource_type_chain&quot;: [{
        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
        &quot;id&quot;: &quot;host&quot;
    }]
}</code></pre>


<h4 id="response_1">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="3-instanceselection">3. 删除 instanceSelection</h3>
<p>必须满足以下条件才能成功删除实例视图:
1. 该实例视图没有被本系统的 Action 关联资源操作引用，具体遍历所有 Action 的 related_resource_types 中的 related_instance_selections 是否存在该实例视图</p>
<h4 id="url_2">URL</h4>
<p>批量删除 (需要 Request.Body)</p>
<blockquote>
<p>DELETE  /api/v1/model/systems/{system_id}/instance-selections</p>
</blockquote>
<p>单个删除 (不需要 Request.Body)</p>
<blockquote>
<p>DELETE /api/v1/model/systems/{system_id}/instance-selections/{instance_selection_id}</p>
</blockquote>
<h4 id="parameters_2">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">instance_selection_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">实例视图 ID</td>
</tr>
<tr>
<td align="left">check_existence</td>
<td align="left">boolean</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">默认会检查 id 存在, 不存在将导致删除失败, 设置 false 不检查 id 是否存在, 直接走删除( <code>delete from table where id in []</code> )</td>
</tr>
</tbody>
</table>
<h4 id="request_2">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;free_host&quot;
    },
    {
        &quot;id&quot;: &quot;biz_topology&quot;
    }
]</code></pre>


<h4 id="response_2">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="action-api">操作 Action API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">操作 id, 系统下唯一, 只允许小写字母开头、包含小写字母、数字、下划线(_)和连接符(-). 最长 32 个字符.</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">操作名称，系统下唯一，参考<a href="../../NamingRules.md">命名规范</a></td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">操作英文名，国际化时切换到英文版本显示，参考<a href="../../NamingRules.md">命名规范</a></td>
</tr>
<tr>
<td align="left">description</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">操作描述</td>
</tr>
<tr>
<td align="left">description_en</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">操作描述英文，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">操作的类型，枚举值包括<code>create\delete\view\edit\list\manage\execute\use</code> 比如创建类操作需要标识为"create"，无法分类可为空字符串</td>
</tr>
<tr>
<td align="left">related_resource_types</td>
<td align="left">Array(Object)</td>
<td align="left">否</td>
<td align="left">操作的对象，资源类型列表，列表顺序与<code>产品展示</code>、<code>鉴权校验</code> 顺序 必须保持一致。<code>如果操作无需关联资源实例，这里为空即可。</code>  <strong>注意这是一个有序的列表!</strong>:</td>
</tr>
<tr>
<td align="left">related_actions</td>
<td align="left">Array(string)</td>
<td align="left">否</td>
<td align="left">操作的依赖操作, 由操作 ID 组成的字符串列表, 用于在申请权限时同时创建依赖权限  <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
<tr>
<td align="left">version</td>
<td align="left">int</td>
<td align="left">否</td>
<td align="left">版本号，允许为空，仅仅作为在权限中心上进行 New 的更新提醒 <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
</tbody>
</table>
<p>related_resource_types 里的元素</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型的来源系统，可以是自身系统或其他系统</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型 ID，操作关联多个资源类型时，<code>同一个related_resource_types里 id 不能重复</code></td>
</tr>
<tr>
<td align="left">name_alias</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">资源类型名称的别名，同一个资源类型对于不同 Action 可以有各自的显示名称</td>
</tr>
<tr>
<td align="left">name_alias_en</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">资源类型名称的别名英文名</td>
</tr>
<tr>
<td align="left">selection_mode</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">选择类型, 即资源在权限中心产品上配置权限时的作用范围, 可选: <code>instance</code>/<code>attribute</code>/<code>all</code>, 如果不设置, 默认为<code>instance</code>, <a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
<tr>
<td align="left">related_instance_selections</td>
<td align="left">Array(Object)</td>
<td align="left">否</td>
<td align="left">关联的实例视图，即资源在权限中心产品上配置权限时的选择方式; 可以配置本系统的实例视图, 也可以配置其他系统的实例视图(如果<code>selection_mode=attribute</code>则该字段不用配置; 如果没有设置<code>selection_mode</code>或<code>selection_mode=instance/all</code>, 此时这个字段不能为空)</td>
</tr>
</tbody>
</table>
<p>related_instance_selections 里的元素 </p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">实例视图的来源系统 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">实例视图 ID</td>
</tr>
<tr>
<td align="left">ignore_iam_path</td>
<td align="left">bool</td>
<td align="left">否</td>
<td align="left">是否配置的权限忽略路径，<code>默认为false</code>，<a href="./00-Concepts.md">更多概念说明</a></td>
</tr>
</tbody>
</table>
<p>注册后，IAM 配置权限时拉取资源的逻辑，请查看<a href="../03-Callback/01-API.md">资源拉取接口协议</a></p>
<p><strong>重要说明：</strong> 
- Action 关联的资源类型必须在权限中心已经注册的，否则 Action 将注册失败
- 若关联的资源类型的自身系统的，则需要先注册该资源类型
- 若关联的资源类型是依赖其他系统的，则需要等依赖系统注册该资源类型后才可以进行该 Action 注册</p>
<h3 id="1-action">1. 添加 action</h3>
<p>限制:
- 一个系统只能创建最多 100 个 action, 所以如果操作会超过 100 个, 需要思考模型的正确性/合理性(例如把实例抽象到了 action 导致 action 随实例增多而增多)</p>
<h4 id="url">URL</h4>
<blockquote>
<p>POST  /api/v1/model/systems/{system_id}/actions</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;biz_create&quot;,
        &quot;name&quot;: &quot;业务创建&quot;,
        &quot;name_en&quot;: &quot;biz_create&quot;,
        &quot;description&quot;: &quot;业务创建是...&quot;,
        &quot;description_en&quot;: &quot;biz_create is...&quot;,
        &quot;type&quot;: &quot;create&quot;,
        &quot;related_resource_types&quot;: [],
        &quot;version&quot;: 1
    },
    {
        &quot;id&quot;: &quot;host_edit&quot;,
        &quot;name&quot;: &quot;主机编辑&quot;,
        &quot;name_en&quot;: &quot;host_edit&quot;,
        &quot;type&quot;: &quot;&quot;,
        &quot;related_resource_types&quot;: [
            {
                &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                &quot;id&quot;: &quot;host&quot;,
                &quot;name_alias&quot;:  &quot;&quot;,
                &quot;name_alias_en&quot;: &quot;&quot;,
                &quot;selection_mode&quot;: &quot;instance&quot;,
                &quot;related_instance_selections&quot;: [
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;free_host&quot;,
                        &quot;ignore_iam_path&quot;: false,
                    }, 
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;biz_topology&quot;,
                        &quot;ignore_iam_path&quot;: false,
                    }, 
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;biz_set_topology&quot;,
                        &quot;ignore_iam_path&quot;: false,
                    }
                ]
            }
        ],
        &quot;related_actions&quot;: [&quot;view&quot;, &quot;delete&quot;],
        &quot;version&quot;: 1
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="2-action">2. 修改 action</h3>
<p><strong>重点：</strong>
- 可更新 name\name_en\type\version\related_resource_types 这 5 个 key 的值， 如果传了对应<code>key</code>并给了<code>空值</code>, 那么执行的是<code>置空操作</code>; 如果没有传<code>key</code>, 表示不更新该字段；
- <code>特别：对于related_resource_types是一个完全覆盖操作，不能单独更新related_resource_types里的某个key的值</code></p>
<h4 id="url_1">URL</h4>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/actions/{action_id}</p>
</blockquote>
<h4 id="parameters_1">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">action_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<h4 id="request_1">Request</h4>
<pre class="codehilite"><code class="language-json">{
   &quot;name&quot;:&quot;主机编辑New&quot;,
   &quot;name_en&quot;:&quot;host_edit&quot;,
   &quot;description&quot;:&quot;主机编辑New是...&quot;,
   &quot;description_en&quot;:&quot;host_edit is...&quot;,
   &quot;related_resource_types&quot;:[
      {
         &quot;system_id&quot;:&quot;bk_cmdb&quot;,
         &quot;id&quot;:&quot;host&quot;,
         &quot;name_alias&quot;:&quot;&quot;,
         &quot;name_alias_en&quot;:&quot;&quot;,
         &quot;selection_mode&quot;: &quot;instance&quot;,
         &quot;related_instance_selections&quot;:[
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;free_host&quot;,
                        &quot;ignore_iam_path&quot;: false,
                    }, 
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;biz_topology&quot;,
                        &quot;ignore_iam_path&quot;: false,
                    }
         ]
      }
   ],
   &quot;related_actions&quot;: [&quot;view&quot;, &quot;delete&quot;],
   &quot;version&quot;:2
}</code></pre>


<h4 id="response_1">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre>


<h3 id="3-action">3. 删除 action</h3>
<p>说明：
- 删除 Action 成功后，将会删除该 Action 相关权限，该删除操作不可逆，请谨慎调用</p>
<h4 id="url_2">URL</h4>
<p>批量删除 (需要 Request.Body)</p>
<blockquote>
<p>DELETE  /api/v1/model/systems/{system_id}/actions</p>
</blockquote>
<p>单个删除 (不需要 Request.Body)</p>
<blockquote>
<p>DELETE /api/v1/model/systems/{system_id}/actions/{action_id}</p>
</blockquote>
<h4 id="parameters_2">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">action_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">操作 ID</td>
</tr>
<tr>
<td align="left">check_existence</td>
<td align="left">boolean</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">默认会检查 id 存在, 不存在将导致删除失败, 设置 false 不检查 id 是否存在, 直接走删除( <code>delete from table where id in []</code> )</td>
</tr>
</tbody>
</table>
<h4 id="request_2">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;id&quot;: &quot;host_edit&quot;
    }
]</code></pre>


<h4 id="response_2">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="actiongroup-api">操作组 ActionGroup API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">操作组名称</td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">操作组英文名，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">Array(Object)</td>
<td align="left">否</td>
<td align="left">操作列表</td>
</tr>
<tr>
<td align="left">sub_groups</td>
<td align="left">Array(Object)</td>
<td align="left">否</td>
<td align="left">下一级操作组</td>
</tr>
</tbody>
</table>
<p>注意:</p>
<ol>
<li>最多<code>两级</code>操作组(即第一级<code>sub_gropus</code>下的操作组不能有下一级<code>sub_groups</code>), 如果嵌套超过两级, 会返回错误 <code>1901400(more than 2-levels action_group, current only support 2-levels)</code> </li>
<li>同一个操作组的<code>actions</code>和<code>sub_groups</code> 不能同时为空 <code>1901400(actions and sub_groups can't be empty at the same time)</code></li>
<li>action 可以挂在一级或二级的<code>操作组</code>上, 但是, 同一个 action 只能挂在一个<code>一级操作组</code>/<code>二级操作组</code>下; 即, action_id 全局 json 内唯一;   <code>1901400(one action can belong only one group)</code> </li>
<li>会校验每一个<code>action_id</code>; 必须是系统注册的合法<code>action_id</code>; 所以使用接口调用注册或者使用 migration 注册时, <code>action_id</code>对应的操作必须先注册, 再更新<code>action_groups</code></li>
</ol>
<h3 id="1">1. 注册或更新 操作组</h3>
<h4 id="url">URL</h4>
<p>注册</p>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/configs/action_groups</p>
</blockquote>
<p>更新 (整个列表完全覆盖更新)</p>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/configs/action_groups</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;name&quot;: &quot;管理权限&quot;,
        &quot;name_en&quot;: &quot;Admin Permissions&quot;,
        &quot;actions&quot;: [
            {
                &quot;id&quot;: &quot;create_biz&quot;
            },
            {
                &quot;id&quot;: &quot;delete_biz&quot;
            }
        ]
    },
    {
        &quot;name&quot;: &quot;运维&quot;,
        &quot;name_en&quot;: &quot;Devops Permissions&quot;,
        &quot;sub_groups&quot;: [
            {
                &quot;name&quot;: &quot;主机权限&quot;,
                &quot;name_en&quot;: &quot;Host Permissions&quot;,
                &quot;actions&quot;: [
                    {
                        &quot;id&quot;: &quot;view_host&quot;
                    },
                    {
                        &quot;id&quot;: &quot;create_host&quot;
                    }
                ]
            }
        ]
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="common-query-api">通用查询 Common Query API</h1>
<h3 id="1">1. 查询系统注册的信息</h3>
<h4 id="url">URL</h4>
<blockquote>
<p>GET /api/v1/model/systems/{system_id}/query</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">fields</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">需要查询的信息类型，枚举值：base_info(基础信息), resource_types(资源类型)，actions(操作)，action_groups (操作组), instance_selections(实例视图), resource_creator_actions(新建关联配置), common_actions(常用操作) 多个以英文逗号分隔，空值时查询所有注册的信息</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">fields=base_info,resource_types,actions,action_groups,instance_selections,resource_creator_actions</code></pre>


<h4 id="response">Response</h4>
<p>说明：
- 返回的信息数据结构与注册时的数据结构一致</p>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        // 基础信息
        &quot;base_info&quot;: {
            &quot;id&quot;: &quot;bk_cmdb&quot;,
            &quot;name&quot;: &quot;配置平台&quot;,
            &quot;name_en&quot;: &quot;CMDB&quot;,
            &quot;description&quot;: &quot;配置平台是...&quot;,
            &quot;description_en&quot;: &quot;CMDB is...&quot;,
            &quot;clients&quot;: &quot;bk_cmdb,cmdb&quot;,
            &quot;provider_config&quot;: {
                &quot;host&quot;: &quot;http://cmdb.service.consul&quot;,
                &quot;auth&quot;: &quot;basic&quot;
            }
        },
        // 资源类型
        &quot;resource_types&quot;: [
            {
                &quot;id&quot;: &quot;host&quot;, 
                &quot;name&quot;: &quot;主机&quot;,
                &quot;name_en&quot;: &quot;host&quot;, 
                &quot;description&quot;: &quot;主机是...&quot;,
                &quot;description_en&quot;: &quot;host is...&quot;, 
                &quot;parents&quot;: [
                    {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;module&quot;}
                ],
                &quot;provider_config&quot;: {
                    &quot;path&quot;: &quot;/api/v1/resources/host/query&quot;
                }
                &quot;version&quot;: 1
           }, 
           {
                &quot;id&quot;: &quot;biz&quot;,
                &quot;name&quot;: &quot;业务&quot;,
                &quot;name_en&quot;: &quot;biz&quot;,
                &quot;description&quot;: &quot;业务是...&quot;,
                &quot;description_en&quot;: &quot;biz is...&quot;,
                &quot;parents&quot;: [
                    {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz_set&quot;}            
                ],
                &quot;provider_config&quot;: {
                    &quot;path&quot;: &quot;/api/v1/resources/biz_set/query&quot;
                }
                &quot;version&quot;: 1
            }
        ],
        // 操作
        &quot;actions&quot;: [
            {
                &quot;id&quot;: &quot;host_edit&quot;,
                &quot;name&quot;: &quot;主机编辑New&quot;,
                &quot;name_en&quot;: &quot;host_edit&quot;,
                &quot;description&quot;: &quot;主机编辑New是...&quot;,
                &quot;description_en&quot;: &quot;host_edit is...&quot;,
                &quot;type&quot;: &quot;&quot;,
                &quot;related_resource_types&quot;: [
                    {
                        &quot;system_id&quot;: &quot;bk_cmdb&quot;,
                        &quot;id&quot;: &quot;host&quot;,
                        &quot;name_alias&quot;:  &quot;服务器&quot;,
                        &quot;name_alias_en&quot;: &quot;server&quot;,
                        &quot;instance_selections&quot;: [
                            {
                                &quot;name&quot;: &quot;资源池主机&quot;,
                                &quot;name_en&quot;: &quot;free host&quot;,
                                &quot;resource_type_chain&quot;: [{&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;host&quot;}]
                            }, 
                            {
                                &quot;name&quot;: &quot;业务拓扑&quot;,
                                &quot;name_en&quot;: &quot;biz topology&quot;,
                                &quot;resource_type_chain&quot;: [{&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;set&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;module&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;host&quot;}]
                            },
                            {
                                &quot;name&quot;: &quot;业务集拓扑&quot;,
                                &quot;name_en&quot;: &quot;biz set topology&quot;
                                &quot;resource_type_chain&quot;: [{&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;biz_set&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;set&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;module&quot;}, {&quot;system_id&quot;: &quot;bk_cmdb&quot;, &quot;id&quot;: &quot;host&quot;}]
                            }
                        ]
                    }
                ],
                &quot;version&quot;: 1,
            }
        ],
        // 实例视图
        &quot;instance_selections&quot;: [
            {
                &quot;id&quot;: &quot;view1&quot;,
                &quot;name&quot;: &quot;实例选择11&quot;,
                &quot;name_en&quot;: &quot;view11&quot;,
                &quot;resource_type_chain&quot;: [
                    {
                        &quot;id&quot;: &quot;bbbdd&quot;,
                        &quot;system_id&quot;: &quot;aaacc&quot;
                    }
                ]
            }
        ],
        &quot;resource_creator_actions&quot;: {
            &quot;config&quot;:[
                {
                    &quot;id&quot;:&quot;biz&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;biz_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;biz_view&quot;,
                            &quot;required&quot;:true
                        },
                        {
                            &quot;id&quot;:&quot;set_create&quot;,
                            &quot;required&quot;:false
                        }
                    ],
                    &quot;sub_resource_types&quot;:[
                        {
                            &quot;id&quot;:&quot;set&quot;,
                            &quot;actions&quot;:[
                                {
                                    &quot;id&quot;:&quot;set_edit&quot;,
                                    &quot;required&quot;:false
                                },
                                {
                                    &quot;id&quot;:&quot;set_view&quot;,
                                    &quot;required&quot;:false
                                },
                                {
                                    &quot;id&quot;:&quot;module_create&quot;,
                                    &quot;required&quot;:false
                                }
                            ],
                            &quot;sub_resource_types&quot;:[
                                {
                                    &quot;id&quot;:&quot;module&quot;,
                                    &quot;actions&quot;:[
                                        {
                                            &quot;id&quot;:&quot;module_edit&quot;,
                                            &quot;required&quot;:false
                                        },
                                        {
                                            &quot;id&quot;:&quot;module_view&quot;,
                                            &quot;required&quot;:false
                                        },
                                        {
                                            &quot;id&quot;:&quot;host_create&quot;,
                                            &quot;required&quot;:false
                                        }
                                    ],
                                    &quot;sub_resource_types&quot;:[
                                        {
                                            &quot;id&quot;:&quot;host&quot;,
                                            &quot;actions&quot;:[
                                                {
                                                    &quot;id&quot;:&quot;host_edit&quot;,
                                                    &quot;required&quot;:false
                                                },
                                                {
                                                    &quot;id&quot;:&quot;host_view&quot;,
                                                    &quot;required&quot;:false
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
}</code></pre><h1 id="token-api">系统 token 查询 API</h1>
<h3 id="token">查询系统 token</h3>
<p>用于<code>权限中心</code> 调用 <code>接入系统</code> 拉取资源信息相关接口的鉴权</p>
<h4 id="url">URL</h4>
<blockquote>
<p>GET /api/v1/model/systems/{system_id}/token</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-bash">{
    &quot;code&quot;: 0,
    &quot;data&quot;: {
        &quot;token&quot;: &quot;dk9httsqmq4bbdu7aqq6cqp1az6i8org&quot;
    },
    &quot;message&quot;: &quot;ok&quot;
}</code></pre><h1 id="commonactions-api">常用操作配置 CommonActions API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">常用操作名称</td>
</tr>
<tr>
<td align="left">name_en</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">常用操作英文名，国际化时切换到英文版本显示</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">Array(Object)</td>
<td align="left">是</td>
<td align="left">操作列表</td>
</tr>
</tbody>
</table>
<h3 id="1">1. 注册或更新 常用操作</h3>
<h4 id="url">URL</h4>
<p>注册</p>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/configs/common_actions</p>
</blockquote>
<p>更新 (整个列表完全覆盖更新)</p>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/configs/common_actions</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    {
        &quot;name&quot;: &quot;测试&quot;,
        &quot;name_en&quot;: &quot;test&quot;,
        &quot;actions&quot;: [
            {
                &quot;id&quot;: &quot;biz_delete&quot;
            }
        ]
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="featureshieldrules-api">功能开关配置 FeatureShieldRules API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">effect</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">支持黑白名单，值为 deny 或 allow</td>
</tr>
<tr>
<td align="left">feature</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">开启或关闭的功能</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">Object</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
</tbody>
</table>
<p>feature 字段枚举值说明：</p>
<p>| 枚举值 | 说明 |
|:---|:---|:---|
| application.custom_permission.grant | 申请自定义权限 |
| application.custom_permission.renew | 申请自定义权限续期 |
| user_permission.custom_permission.delete | 自定义权限删除 |</p>
<p>action 字段说明：</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">Action 的唯一标识，<code>特别说明:</code> 如果功能是针对整个接入系统，则 id 为 *</td>
</tr>
</tbody>
</table>
<p><code>特别说明</code>：
1. 多条 allow/deny 规则判断最终 effect 的逻辑（类似 Nginx 的 IP 白名单判断），即判断某个功能开启或关闭逻辑：</p>
<pre class="codehilite"><code class="language-bash">在某个功能下的该系统的某个Action的开启与否：allow *[开启] &gt; allow action_id[开启] &gt; deny *[关闭] &gt; deny action_id[关闭] &gt; 默认开启
（1）如果存在allow * 或 allow action_id 的规则匹配，则开启
（3）如果不存在allow * 和 allow action_id 规则，但有deny * 或者deny action_id 规则匹配，则关闭
（4）如果没有任何规则匹配，则默认开启

一般来说，只需要配置屏蔽的功能即可</code></pre>


<ol>
<li>对于依赖操作，如果被屏蔽了，则不会创建依赖操作，比如 edit 依赖 view，但是 view 被屏蔽了，则申请 edit 权限时，不会创建其依赖操作 view</li>
</ol>
<h3 id="1">1. 注册或更新 功能开关规则</h3>
<h4 id="url">URL</h4>
<p>注册</p>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/configs/feature_shield_rules</p>
</blockquote>
<p>更新 (整个列表完全覆盖更新)</p>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/configs/feature_shield_rules</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">[
    // 对于自定义申请，屏蔽整个该接入系统所有Action，即该接入系统不支持自定义申请
    {
        &quot;effect&quot;: &quot;deny&quot;,
        &quot;feature&quot;: &quot;application.custom_permission.grant&quot;,
        &quot;action&quot;: {
            &quot;id&quot;: &quot;*&quot;
        }
    },
    // 对于个人权限，接入系统某个Aciton的自定义权限不允许被删除
    {
        &quot;effect&quot;: &quot;deny&quot;,
        &quot;feature&quot;: &quot;user_permission.custom_permission.delete&quot;,
        &quot;action&quot;: {
            &quot;id&quot;: &quot;access_business&quot;
        }
    }
]</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="resourcecreatoraction-api">新建关联配置 ResourceCreatorAction API</h1>
<h3 id="_1">参数说明</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">config</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">新建关联的配置文件，包含了每种资源类型对应的创建时可以对创建者进行授权的 Action</td>
</tr>
</tbody>
</table>
<p>config 里的每个元素的字段说明:</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型的唯一标识</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">对应资源被创建时可以对创建者进行授权的 Action 列表</td>
</tr>
<tr>
<td align="left">sub_resource_types</td>
<td align="left">array(object)</td>
<td align="left">否</td>
<td align="left">子资源类型相关可授权的 Action 相关配置信息，列表每个元素同 config 列表里的每个元素一样，这是个递归结构</td>
</tr>
</tbody>
</table>
<p>actions 里的每个元素的字段说明：</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">Action 的唯一标识</td>
</tr>
<tr>
<td align="left">required</td>
<td align="left">bool</td>
<td align="left">是</td>
<td align="left">该 Action 是否是必须的，即后续权限中心支持企业和用户修改创建者赋权时，该 Action 能否不被选择授予</td>
</tr>
</tbody>
</table>
<p><strong><code>required 字段特别说明</code></strong></p>
<blockquote>
<p>假设资源类型 host 产生时可以对 host_edit 、host_view、host_delete 这 3 个权限授权，且 host_delete 配置 required=true</p>
</blockquote>
<ul>
<li>
<p>后续权限中心将支持用户和企业自定义这个新建关联的配置时，host_delete 是必选的，无法去除</p>
</li>
<li>
<p>如果用户自定义新建管理的配置是 host 产生时对 host_view、host_delete 这 2 个权限授权（host_edit 和 host_view 由于 required=false，所以是可以配置为不授权的），那么该用户在接入系统新增 host 后，自动拥有 host_view 和 host_delete</p>
</li>
</ul>
<p><code>注意:</code>
1. 层级结构是依据资源的层级
2. 后续权限中心将会支持这份配置可由企业全局修改和每个用户自定义</p>
<h3 id="1">1. 注册或更新 新建关联配置</h3>
<h4 id="url">URL</h4>
<p>注册</p>
<blockquote>
<p>POST /api/v1/model/systems/{system_id}/configs/resource_creator_actions</p>
</blockquote>
<p>更新 (整个列表完全覆盖更新)</p>
<blockquote>
<p>PUT /api/v1/model/systems/{system_id}/configs/resource_creator_actions</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<ul>
<li>[样例] cmdb 可能的新建关联配置</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;config&quot;:[
        {
            &quot;id&quot;:&quot;biz&quot;,
            &quot;actions&quot;:[
                {
                    &quot;id&quot;:&quot;biz_edit&quot;,
                    &quot;required&quot;:false
                },
                {
                    &quot;id&quot;:&quot;biz_view&quot;,
                    &quot;required&quot;:true
                },
                {
                    &quot;id&quot;:&quot;set_create&quot;,
                    &quot;required&quot;:false
                }
            ],
            &quot;sub_resource_types&quot;:[
                {
                    &quot;id&quot;:&quot;set&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;set_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;set_view&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;module_create&quot;,
                            &quot;required&quot;:false
                        }
                    ],
                    &quot;sub_resource_types&quot;:[
                        {
                            &quot;id&quot;:&quot;module&quot;,
                            &quot;actions&quot;:[
                                {
                                    &quot;id&quot;:&quot;module_edit&quot;,
                                    &quot;required&quot;:false
                                },
                                {
                                    &quot;id&quot;:&quot;module_view&quot;,
                                    &quot;required&quot;:false
                                },
                                {
                                    &quot;id&quot;:&quot;host_create&quot;,
                                    &quot;required&quot;:false
                                }
                            ],
                            &quot;sub_resource_types&quot;:[
                                {
                                    &quot;id&quot;:&quot;host&quot;,
                                    &quot;actions&quot;:[
                                        {
                                            &quot;id&quot;:&quot;host_edit&quot;,
                                            &quot;required&quot;:false
                                        },
                                        {
                                            &quot;id&quot;:&quot;host_view&quot;,
                                            &quot;required&quot;:false
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}</code></pre>


<ul>
<li>[样例] 标准运维新建关联配置</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;config&quot;:[
        {
            &quot;id&quot;:&quot;project&quot;,
            &quot;actions&quot;:[
                {
                    &quot;id&quot;:&quot;project_fast_create_task&quot;,
                    &quot;required&quot;:false
                },
                {
                    &quot;id&quot;:&quot;flow_create&quot;,
                    &quot;required&quot;:false
                },
                {
                    &quot;id&quot;:&quot;project_edit&quot;,
                    &quot;required&quot;:false
                },
                {
                    &quot;id&quot;:&quot;project_view&quot;,
                    &quot;required&quot;:false
                }
            ],
            &quot;sub_resource_types&quot;:[
                {
                    &quot;id&quot;:&quot;common_flow&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;common_flow_view&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;common_flow_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;common_flow_delete&quot;,
                            &quot;required&quot;:false
                        }
                    ]
                },
                {
                    &quot;id&quot;:&quot;flow&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;flow_create_periodic_task&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;flow_create_mini_app&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;flow_create_task&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;flow_delete&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;flow_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;flow_view&quot;,
                            &quot;required&quot;:false
                        }
                    ]
                },
                {
                    &quot;id&quot;:&quot;mini_app&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;mini_app_create_task&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;mini_app_delete&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;mini_app_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;mini_app_view&quot;,
                            &quot;required&quot;:false
                        }
                    ]
                },
                {
                    &quot;id&quot;:&quot;periodic_task&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;periodic_task_view&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;periodic_task_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;periodic_task_delete&quot;,
                            &quot;required&quot;:false
                        }
                    ]
                },
                {
                    &quot;id&quot;:&quot;task&quot;,
                    &quot;actions&quot;:[
                        {
                            &quot;id&quot;:&quot;task_view&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;task_edit&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;task_operate&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;task_claim&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;task_delete&quot;,
                            &quot;required&quot;:false
                        },
                        {
                            &quot;id&quot;:&quot;task_clone&quot;,
                            &quot;required&quot;:false
                        }
                    ]
                }
            ]
        }
    ]
}</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="_1">名词及概念说明</h1>
<h2 id="1-resource">1. 资源实例 Resource</h2>
<ul>
<li>id：资源实例唯一标识，<code>需要保证对于一个系统同一种资源类型下id唯一</code></li>
<li>type: 资源类型的 ID，比如主机、集群、业务即 host、set、biz</li>
<li>name: 资源实例名称，比如 192.168.1.1</li>
<li>display_name: 资源实例展示名称，比如 大区 1(qq 大区)</li>
</ul>
<h2 id="2">2. 可用于配置权限的<code>属性</code>和<code>属性值</code></h2>
<p>可以使用资源属性配置权限, 例如用户 1 可以操作所有<code>os=linux</code>的主机;</p>
<p>为了实现这个功能, 需要从接入系统拉取可以配置权限的属性及属性值列表;</p>
<p>比如：在配置平台中，<code>主机</code>有属性<code>地区</code>，属性值, 枚举: 中国、美国、新加坡、日本等，则：</p>
<pre class="codehilite"><code class="language-bash">属性 id = &quot;area&quot;
属性 display_name = &quot;地区&quot;
属性值 id = &quot;China&quot;
属性值  display_name = &quot;中国&quot;</code></pre>


<p>属性值 id 的类型支持 <code>string/int/bool</code>; 以配置平台主机属性为例：</p>
<pre class="codehilite"><code class="language-json">[string]
属性 id = &quot;os&quot;
属性 display_name = &quot;操作系统&quot;
属性值 id = &quot;linux&quot; 
属性值 display_name = &quot;Linux&quot; 

[int]
属性 id = &quot;isp&quot;
属性 display_name = &quot;运营商&quot;
属性值 id = 1 
属性值 display_name = &quot;中国电信&quot;

[bool]
属性 id = &quot;is_public&quot;
属性 display_name = &quot;是否公共&quot;
属性值 id = true
属性值 display_name = &quot;是&quot; </code></pre>


<h2 id="3-path">3. 特殊属性：路径(path)属性说明</h2>
<p><a href="../../../Explanation/04-BkIAMPath.md">说明: 资源拓扑<code>_bk_iam_path_</code></a></p><h1 id="api">资源拉取 API</h1>
<h2 id="api_1">API 地址</h2>
<p>接入系统注册模型到权限中心时
- 注册<code>system</code>有提供<code>system.provider_config.host</code>; 假设为<code>http://cmdb.consul</code>
- 注册<code>resource_type</code>有提供<code>system.provider_config.path</code>; 假设为<code>/api/v1/resources</code></p>
<p>那么权限中心将调用<code>http://cmdb.consul/api/v1/resources</code>去拉取该资源类型相关信息</p>
<p>即: 接入系统需要实现一个 API, 用于权限中心拉取不同资源类型的信息;</p>
<p>需要支持: (一个接口根据参数做分发)
1. list_attr 查询某个资源类型可用于配置权限的属性列表
2. list_attr_value 获取一个资源类型某个属性的值列表
3. list_instance 根据过滤条件查询实例
4. fetch_instance_info 批量获取资源实例详情
5. list_instance_by_policy 根据策略表达式查询资源实例
6. search_instance 搜索资源实例</p>
<hr />
<h2 id="_1">接口协议前置说明</h2>
<p>Request Header: 
- <a href="../01-Overview/03-APIAuth.md">系统间调用接口鉴权:权限中心-&gt;接入系统</a>
- <code>Blueking-Language</code>  国际化多语言，值为：zh-cn 或 en，当值为 en 时，则接口数据返回中包含的 display_name 字段的值为英文，否则默认返回中文；
-  <code>X-Request-Id</code>  请求 request_id, 请记录, 用于错误排查</p>
<p>Response Header:
-  <code>X-Request-Id</code>  将请求 Header 头里的 request_id 返回, 用于错误排查</p>
<p>Response Body: 
遵循蓝鲸官方 API 协议进行返回, <code>code != 0</code> 表示出错, <code>message</code>包含具体信息</p>
<pre class="codehilite"><code class="language-bash">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
    }
}</code></pre>


<p><strong>重要</strong>: 接入系统 API 都需要返回一个<code>request_id</code>, 权限中心将会在日志中记录, 以便后续联调及正式环境中进行问题排查; </p>
<hr />
<h2 id="_2">协议</h2>
<ul>
<li>Method: <code>POST</code> (注意, 是<code>POST</code>)</li>
<li>Path: <code>system.provider_config.host</code> + <code>system.provider_config.path</code></li>
<li>Request.Body:</li>
</ul>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">需要查询资源信息的方式，不同方式对应查询资源的不同信息，目前值有：<a href="./10-list_attr.md">list_attr</a>、<a href="./11-list_attr_value.md">list_attr_value</a>、 <a href="./12-list_instance.md">list_instance</a>、<a href="./13-fetch_instance_info.md">fetch_instance_info</a>、<a href="./14-list_instance_by_policy.md">list_instance_by_policy</a>、<a href="./15-search_instance.md">search_instance</a>，具体每个值的协议请往下看</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">否</td>
<td align="left">根据不同查询方式(method)，传入不同的过滤参数</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">object</td>
<td align="left">否</td>
<td 0="0" 10_="10," _offset_:="&quot;offset&quot;:" align="left" limit:="limit:">当返回数据需要支持分页时，需要参数，具体包含 limit 和 offset 字段，其值类型为 int，比如 </td>
</tr>
</tbody>
</table>
<ul>
<li>Response.Body: </li>
</ul>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">code</td>
<td align="left">int</td>
<td align="left">是</td>
<td align="left">表示请求是否成功，0 表示成功，<code>code != 0</code> 表示出错</td>
</tr>
<tr>
<td align="left">message</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">code != 0 时，message 表示错误信息，code=0 时 可返回 ok 或空字符串</td>
</tr>
<tr>
<td align="left">data</td>
<td align="left">object/array</td>
<td align="left">是</td>
<td align="left">根据不同查询方式(method)，返回的内容也不一样，类型可为数组或者字典</td>
</tr>
</tbody>
</table>
<ul>
<li>code 字段特别说明：</li>
</ul>
<table>
<thead>
<tr>
<th align="left">值</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>code = 401</code></td>
<td align="left">代表接口认证失败</td>
</tr>
<tr>
<td align="left"><code>code = 404</code></td>
<td align="left">代表查询的 type(资源类型)或 method(查询资源信息的方式) 不存在，或其他不存在的返回，message 为具体错误信息</td>
</tr>
<tr>
<td align="left"><code>code = 500</code></td>
<td align="left">代表查询时出现系统错误或异常，message 为具体错误或异常信息</td>
</tr>
<tr>
<td align="left"><code>code = 422</code></td>
<td align="left">代表查询时，特别是有过滤搜索时，扫描的资源内容过多，拒绝返回数据</td>
</tr>
<tr>
<td align="left"><code>code = 406</code></td>
<td align="left">代表搜索时 keyword 不符合要求</td>
</tr>
<tr>
<td align="left"><code>code = 429</code></td>
<td align="left">代表接口请求超过接入系统的频率控制</td>
</tr>
</tbody>
</table>
<ul>
<li>说明<ul>
<li>接口只提供给 iam 使用, 需要单独 url/鉴权/逻辑等, 避免同现有业务使用 api 重复</li>
<li>上面的 URL 只是一个示例, 可自行定义, 注册到权限中心即可</li>
<li>需要支持版本, url 格式如<code>/api/v1/</code>, 确保后续可以进行 api 升级</li>
<li>性能要求: </li>
</ul>
</li>
</ul>
<pre class="codehilite"><code class="language-bash">[list_attr] 
&lt; 50ms

[list_attr_value]
无keyword搜索和id过滤条件 &lt; 50ms
keyword搜索 &lt; 100ms
批量 id 过滤（id数量小于10个）&lt; 100ms
批量 id 过滤（id数量大于10个）&lt; 200ms

[list_instance]
按照资源的上级过滤查询 &lt; 50ms

[fetch_instance_info] 性能敏感，由于用于鉴权，所以必须严格保证该接口性能
单个资源获取 &lt; 20ms
批量资源获取 &lt; 100ms

[list_instance_by_policy]
&lt; 500ms

[search_instance]
按照资源实例进行keyword搜索查询 &lt; 100ms</code></pre><h1 id="list_attr">list_attr</h1>
<h2 id="list_attr_1">list_attr 查询某个资源类型可用于配置权限的属性列表</h2>
<blockquote>
<p>在权限中心里用于（1）<code>产品</code>上按照属性配置权限（2）<code>产品</code>上回显权限</p>
</blockquote>
<p>比如: 在配置平台中，主机的可用于配置权限的属性列表：os(操作系统)/country(国家)/province(省份)/isp(运营商) 等</p>
<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型(ResourceType)</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：list_attr</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_attr&quot;
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>data 字段，类型为 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性的唯一标识</td>
</tr>
<tr>
<td align="left">display_name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性的展示名称</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: [
        {&quot;id&quot;: &quot;os&quot;, &quot;display_name&quot;: &quot;操作系统&quot;},
        {&quot;id&quot;: &quot;country&quot;, &quot;display_name&quot;: &quot;国家&quot;},
        {&quot;id&quot;: &quot;province&quot;, &quot;display_name&quot;: &quot;省份&quot;},
        {&quot;id&quot;: &quot;isp&quot;, &quot;display_name&quot;: &quot;运营商&quot;}
    ]
}</code></pre><h1 id="list_attr_value">list_attr_value</h1>
<h2 id="list_attr_value_1">list_attr_value 获取一个资源类型某个属性的值列表</h2>
<blockquote>
<p>可用于配置权限的属性 的值列表</p>
<p>在权限中心产品里用于（1）<code>产品</code>上按照属性配置权限（2）<code>产品</code>上回显权限</p>
</blockquote>
<p>比如: 在配置平台中，主机(host)资源的操作系统属性(os)可用于配置权限，对应的操作系统属性的值列表：linux(Linux)、windows(Windows)、mac(Mac)</p>
<h3 id="_1">需支持的过滤查询</h3>
<ul>
<li>keyword 搜索<ul>
<li>接入系统获取到 keyword 后，可选择 id 或 display_name 进行模糊搜索过滤，模糊搜索规则可以是前缀匹配或包含子串等其他匹配规则</li>
</ul>
</li>
<li>批量 id 过滤</li>
</ul>
<p>简单例子：
【keyword 搜索】</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;attr&quot;: &quot;os&quot;,
    &quot;keyword&quot;: &quot;Li&quot; 
}</code></pre>


<p>【批量 id 过滤】</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;attr&quot;: &quot;os&quot;,
    &quot;ids&quot;: [&quot;linux&quot;, &quot;windows&quot;]
}</code></pre>


<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：list_attr_value</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">根据 2.1 里需支持的过滤查询，传入不同的参数</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">返回数据需要支持分页，该参数必填，具体说明请查看 <a href="./01-API.md">需实现接口的基础协议里的 Request.Body.page 字段</a>, <code>limit 最大为1000</code></td>
</tr>
</tbody>
</table>
<p>filter 字段</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">attr</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">需要查询的资源属性 id</td>
</tr>
<tr>
<td align="left">keyword</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">资源属性值的搜索关键字</td>
</tr>
<tr>
<td align="left">ids</td>
<td align="left">Array(string/int/bool)</td>
<td align="left">否</td>
<td align="left">资源属性值 ID 列表, <a href="./00-Concepts.md">值的数据类型详细说明</a></td>
</tr>
</tbody>
</table>
<ul>
<li>无过滤条件</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_attr_value&quot;,
    &quot;filter&quot;: {
        &quot;attr&quot;: &quot;os&quot;
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<ul>
<li>有过滤条件</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_attr_value&quot;,
    &quot;filter&quot;: {
        &quot;attr&quot;: &quot;os&quot;,
        &quot;keyword&quot;: &quot;Li&quot;
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>data 字段，类型为 Dict</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">count</td>
<td align="left">int</td>
<td align="left">是</td>
<td align="left">查询到的总数量</td>
</tr>
<tr>
<td align="left">results</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">对应的属性值列表</td>
</tr>
</tbody>
</table>
<p>results 字段，类型 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string/int/bool</td>
<td align="left">是</td>
<td align="left">资源属性值的唯一标识, <a href="./00-Concepts.md">值的数据类型详细说明</a></td>
</tr>
<tr>
<td align="left">display_name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性值的展示名称</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        &quot;count&quot;: 100,
        &quot;results&quot;: [
            {&quot;id&quot;: &quot;linux&quot;, &quot;display_name&quot;: &quot;Linux&quot;},
            {&quot;id&quot;: &quot;windows&quot;, &quot;display_name&quot;: &quot;Windows&quot;},
            {&quot;id&quot;: &quot;mac&quot;, &quot;display_name&quot;: &quot;Mac&quot;}
        ]
    }
}</code></pre><h1 id="list_instance">list_instance</h1>
<h2 id="list_instance_1">list_instance 根据过滤条件查询实例</h2>
<blockquote>
<p>在权限中心里用于（1）<code>产品</code>上按照资源拓扑树选择资源实例</p>
</blockquote>
<h3 id="_1">需支持的过滤查询</h3>
<ul>
<li>按照资源的上级过滤查询</li>
</ul>
<p>简单例子：</p>
<p>【按照资源的上级过滤查询】</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;parent&quot;: {
        &quot;type&quot;: &quot;module&quot;,
        &quot;id&quot;: &quot;m1&quot;
    }
}</code></pre>


<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：list_instance</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">否</td>
<td align="left">根据 3.1 里需支持的过滤查询，传入不同的参数</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">返回数据需要支持分页，该参数必填，具体说明请查看 <a href="./01-API.md">需实现接口的基础协议里的 Request.Body.page 字段</a>, <code>limit 最大为1000</code></td>
</tr>
</tbody>
</table>
<p>filter 字段</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">parent</td>
<td align="left">object</td>
<td align="left">否</td>
<td align="left">资源的直接上级，具体包含 type 和 id，type 为直接上级资源的类型，id 为直接上级资源实例 ID</td>
</tr>
</tbody>
</table>
<ul>
<li>无条件查询</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_instance&quot;,
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<ul>
<li>上级过滤查询</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_instance&quot;,
    &quot;filter&quot;: {
        &quot;parent&quot;: {
            &quot;type&quot;: &quot;module&quot;,
            &quot;id&quot;: &quot;m1&quot;
        }
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>data 字段，类型为 Dict</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">count</td>
<td align="left">int</td>
<td align="left">是</td>
<td align="left">查询到的资源实例的总数量</td>
</tr>
<tr>
<td align="left">results</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">对应的资源实例列表</td>
</tr>
</tbody>
</table>
<p>results 字段 ，类型 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的唯一标识</td>
</tr>
<tr>
<td align="left">display_name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的展示名称</td>
</tr>
<tr>
<td align="left">child_type</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">非必填，仅仅"用户管理"系统定制的字段，其他系统不需要返回，表示该资源实例的下一层资源类型，仅仅用于动态资源层级，且其下一层与本层类型一致的情况，空值表示已经无下一层级，该数据将用于在权限中心产品拉取同一资源动态层级拓扑</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        &quot;count&quot;: 100,
        &quot;results&quot;: [
            {&quot;id&quot;: &quot;h1&quot;, &quot;display_name&quot;: &quot;192.168.1.1&quot;},
            {&quot;id&quot;: &quot;h2&quot;, &quot;display_name&quot;: &quot;192.168.1.2&quot;},
            {&quot;id&quot;: &quot;h3&quot;, &quot;display_name&quot;: &quot;192.168.1.3&quot;}
        ]
    }
}</code></pre><h1 id="fetch_instance_info">fetch_instance_info</h1>
<h2 id="fetch_instance_info_1">fetch_instance_info 批量获取资源实例详情</h2>
<blockquote>
<p>在权限中心里用于（1）<code>产品</code>上回显权限（2）<code>鉴权</code>上依赖资源的查询</p>
</blockquote>
<h3 id="_1">需支持的查询</h3>
<ul>
<li>批量属性 attr 列表</li>
</ul>
<p>简单例子：</p>
<p>【批量属性 attr 列表】</p>
<p>比如查询主机 h1 和主机 h2 的 路径(path)、名称(name)、操作系统(os)和所属国家(country)</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;ids&quot;: [&quot;h1&quot;, &quot;h2&quot;],  // 资源实例ID
    &quot;attrs&quot;: [&quot;_bk_iam_path_&quot;, &quot;display_name&quot;, &quot;os&quot;, &quot;country&quot;] // 属性列表
}</code></pre>


<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：fetch_instance_info</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">根据需支持的查询，传入不同的参数</td>
</tr>
</tbody>
</table>
<p>filter 字段:</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">ids</td>
<td align="left">array(string)</td>
<td align="left">是</td>
<td align="left">需要查询的资源实例的唯一标识列表, <code>最多1000个</code></td>
</tr>
<tr>
<td align="left">attrs</td>
<td align="left">array(string)</td>
<td align="left">否</td>
<td align="left">需要查询的资源属性列表，比如["<em>bk_iam_path</em>", "os"]，空列表或无该参数则表示查询所有属性</td>
</tr>
</tbody>
</table>
<ul>
<li>无查询条件，表示查询资源的所有属性</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;fetch_instance_info&quot;,
    &quot;filter&quot;: {
        &quot;ids&quot;: [&quot;h1&quot;, &quot;h2&quot;]
    }
}</code></pre>


<ul>
<li>有过滤条件</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;fetch_instance_info&quot;,
    &quot;filter&quot;: {
        &quot;ids&quot;: [&quot;h1&quot;, &quot;h2&quot;],
        &quot;attrs&quot;: [&quot;_bk_iam_path_&quot;, &quot;os&quot;, &quot;country&quot;]
    }
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>data 字段，类型为 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的唯一标识</td>
</tr>
<tr>
<td align="left"><code>&lt;attr&gt;</code></td>
<td align="left">string/int/bool 或 array(string/int/bool)</td>
<td align="left">是</td>
<td align="left">根据查询条件中的 attrs 返回，无 attrs 参数则返回所有属性</td>
</tr>
</tbody>
</table>
<p><code>特殊属性</code>:</p>
<ul>
<li><a href="../../../Explanation/04-BkIAMPath.md">说明: 资源拓扑<code>_bk_iam_path_</code></a></li>
<li><a href="../../../Explanation/08-BkIAMApprover.md">说明: 资源审批人<code>_bk_iam_approver_</code></a></li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: [
        {
            &quot;id&quot;: &quot;h1&quot;,
            &quot;os&quot;: &quot;Linux&quot;,
            &quot;country&quot;: &quot;China&quot;,
            &quot;isp&quot;: 1,
            &quot;is_public&quot;: true,
            &quot;_bk_iam_path_&quot;: [
                &quot;/biz,1/set,1/module,1/&quot;,
                &quot;/biz,1/set,1/module,2/&quot;
            ]
        },
        {
            &quot;id&quot;: &quot;h2&quot;,
            &quot;os&quot;: &quot;Windows&quot;,
            &quot;country&quot;: &quot;China&quot;,
            &quot;isp&quot;: 3,
            &quot;is_public&quot;: false,
            &quot;_bk_iam_path_&quot;: [
                &quot;/biz,1/set,1/module,1/&quot;,
                &quot;/biz_set,1/set,2/module,2/&quot;
            ]
        }
    ]
}</code></pre><h1 id="list_instance_by_policy">list_instance_by_policy</h1>
<h2 id="list_instance_by_policy_1">list_instance_by_policy 根据策略表达式查询资源实例</h2>
<blockquote>
<p>在权限中心里用于（1）<code>产品</code>上动态查询资源实例进行预览</p>
</blockquote>
<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：list_instance_by_policy</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">查询条件</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">返回数据需要支持分页，该参数必填，具体说明请查看 <a href="./01-API.md">需实现接口的基础协议里的 Request.Body.page 字段</a></td>
</tr>
</tbody>
</table>
<p>filter 字段</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">expression</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">资源的表达式，<a href="../../Expression/01-Schema.md">协议请查看</a></td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;list_instance_by_policy&quot;,
    &quot;filter&quot;: {
        &quot;expression&quot;: {
            &quot;op&quot;: &quot;OR&quot;,
            &quot;content&quot;: [
            {
                &quot;op&quot;: &quot;in&quot;,
                &quot;field&quot;: &quot;host.id&quot;,
                &quot;value&quot;: [1, 2, 3]
            },
            {
                &quot;op&quot;: &quot;eq&quot;,
                &quot;field&quot;: &quot;host.os&quot;,
                &quot;value&quot;: &quot;linux&quot;
            },
            {
                &quot;op&quot;: &quot;eq&quot;,
                &quot;field&quot;: &quot;host.owner&quot;,
                &quot;value&quot;: &quot;admin&quot;
            },
            {
                &quot;op&quot;: &quot;OR&quot;,
                &quot;content&quot;: [
                {
                    &quot;op&quot;: &quot;starts_with&quot;,
                    &quot;field&quot;: &quot;host._bk_iam_path_&quot;,
                    &quot;value&quot;: &quot;/biz,1/&quot;
                },
                {
                    &quot;op&quot;: &quot;starts_with&quot;,
                    &quot;field&quot;: &quot;host._bk_iam_path_&quot;,
                    &quot;value&quot;: &quot;/biz,2/&quot;
                }]
            },
            {
                &quot;op&quot;: &quot;AND&quot;,
                &quot;content&quot;: [
                {
                    &quot;op&quot;: &quot;eq&quot;,
                    &quot;field&quot;: &quot;host.biz&quot;,
                    &quot;value&quot;: &quot;bk&quot;
                },
                {
                    &quot;op&quot;: &quot;eq&quot;,
                    &quot;field&quot;: &quot;host.status&quot;,
                    &quot;value&quot;: &quot;online&quot;
                }]
            }]
        }
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }    
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>data 字段，类型为 Dict</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">count</td>
<td align="left">int</td>
<td align="left">是</td>
<td align="left">查询到的资源实例的总数量</td>
</tr>
<tr>
<td align="left">results</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">对应到的资源实例列表</td>
</tr>
</tbody>
</table>
<p>results 字段 ，类型 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的唯一标识</td>
</tr>
<tr>
<td align="left">display_name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的展示名称</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        &quot;count&quot;: 100,
        &quot;results&quot;: [
            {&quot;id&quot;: &quot;h1&quot;, &quot;display_name&quot;: &quot;192.168.1.1&quot;},
            {&quot;id&quot;: &quot;h2&quot;, &quot;display_name&quot;: &quot;192.168.1.2&quot;},
            {&quot;id&quot;: &quot;h3&quot;, &quot;display_name&quot;: &quot;192.168.1.3&quot;}
        ]
    }
}</code></pre><h1 id="search_instance">search_instance</h1>
<h2 id="search_instance_1">search_instance 根据过滤条件和搜索关键字查询实例</h2>
<blockquote>
<p>在权限中心里用于（1）<code>产品</code>上搜索资源实例（1）<code>产品</code>上支持拓扑树的资源搜索</p>
</blockquote>
<h3 id="_1">需支持的过滤查询</h3>
<ul>
<li>按照资源实例进行 Keyword 搜索查询<ul>
<li>接入系统获取到 keyword 后，可支持对应资源实例的唯一标识 id、名称 name、展示名称 display_name 等字段进行模糊搜索过滤，<code>默认必须支持display_name搜索</code>，搜索结果为<code>包含关键词</code>。</li>
</ul>
</li>
<li>按照资源的上级 + 资源实例 Keyword 搜索 查询</li>
</ul>
<p><strong>重要</strong>：
<code>搜索不要区分大小写！！！</code>
<code>搜索不要区分大小写！！！</code>
<code>搜索不要区分大小写！！！</code></p>
<p>简单例子：</p>
<p>【按照资源实例进行 Keyword 搜索查询】</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;keyword&quot;: &quot;192.168.&quot;
}</code></pre>


<p>【按照资源的上级 + 资源实例 Keyword 搜索 查询】</p>
<pre class="codehilite"><code class="language-json">&quot;filter&quot;: {
    &quot;parent&quot;: {
        &quot;type&quot;: &quot;module&quot;,
        &quot;id&quot;: &quot;m1&quot;
    },
    &quot;keyword&quot;: &quot;192.168.&quot;
}</code></pre>


<p><strong><code>特别注意</code></strong>
由于 keyword 搜索可能性能很低，接入系统需要做<code>频率控制</code>和实现适当的<code>缓存机制</code>，否则可能会引发接入系统负载过高而导致正常业务服务的故障</p>
<h3 id="requestbody">Request.Body</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">对应查询的资源类型</td>
</tr>
<tr>
<td align="left">method</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">值为：search_instance</td>
</tr>
<tr>
<td align="left">filter</td>
<td align="left">object</td>
<td align="left">否</td>
<td align="left">根据 6.1 里需支持的过滤查询，传入不同的参数</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">返回数据需要支持分页，该参数必填，具体说明请查看 <a href="./01-API.md">需实现接口的基础协议里的 Request.Body.page 字段</a>, <code>limit 最大为1000</code></td>
</tr>
</tbody>
</table>
<p>filter 字段</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">keyword</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">资源实例的搜索关键字</td>
</tr>
<tr>
<td align="left">parent</td>
<td align="left">object</td>
<td align="left">否</td>
<td align="left">资源的直接上级，具体包含 type 和 id，type 为直接上级资源的类型，id 为直接上级资源实例 ID  <code>两种情况下可为空，(1) 本身资源类型无上级 (2) 权限中心产品上只需要根据Keyword全局搜索该资源类型，可能场景如某种资源类型的下拉框过滤选择</code></td>
</tr>
</tbody>
</table>
<ul>
<li>Keyword 搜索查询</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;search_instance&quot;,
    &quot;filter&quot;: {
        &quot;keyword&quot;: &quot;192.168.&quot;
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<ul>
<li>上级+Keyword 搜索查询</li>
</ul>
<pre class="codehilite"><code class="language-bash">{
    &quot;type&quot;: &quot;host&quot;,
    &quot;method&quot;: &quot;search_instance&quot;,
    &quot;filter&quot;: {
       &quot;parent&quot;: {
            &quot;type&quot;: &quot;module&quot;,
            &quot;id&quot;: &quot;m1&quot;
        }
        &quot;keyword&quot;: &quot;192.168.&quot;
    },
    &quot;page&quot;: {
        &quot;offset&quot;: 0,
        &quot;limit&quot;: 20
    }
}</code></pre>


<h3 id="responsebody">Response.Body</h3>
<p>code 字段说明
- <code>code = 422</code> 代表 Keyword 搜索时，扫描的资源内容过多，无法支持，拒绝返回数据，对于 IAM 产品上将提示用户完善搜索条件再搜索
- <code>code = 429</code> 代表接口超过接入系统的频率控制 </p>
<p>data 字段，类型为 Dict</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">count</td>
<td align="left">int</td>
<td align="left">是</td>
<td align="left">查询到的资源实例的总数量</td>
</tr>
<tr>
<td align="left">results</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">对应的资源实例列表</td>
</tr>
</tbody>
</table>
<p>results 字段 ，类型 Array</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的唯一标识</td>
</tr>
<tr>
<td align="left">display_name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的展示名称</td>
</tr>
<tr>
<td align="left">child_type</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">非必填，仅仅"用户管理"系统定制的字段，其他系统不需要返回，表示该资源实例的下一层资源类型，仅仅用于动态资源层级，且其下一层与本层类型一致的情况，空值表示已经无下一层级，该数据将用于在权限中心产品拉取同一资源动态层级拓扑</td>
</tr>
</tbody>
</table>
<ul>
<li>正常查询返回</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;&quot;,
    &quot;data&quot;: {
        &quot;count&quot;: 100,
        &quot;results&quot;: [
            {&quot;id&quot;: &quot;h1&quot;, &quot;display_name&quot;: &quot;192.168.1.1&quot;},
            {&quot;id&quot;: &quot;h2&quot;, &quot;display_name&quot;: &quot;192.168.1.2&quot;},
            {&quot;id&quot;: &quot;h3&quot;, &quot;display_name&quot;: &quot;192.168.1.3&quot;}
        ]
    }
}</code></pre>


<ul>
<li>搜到的 Keyword 不满足要求，即 keyword 的参数校验规则，比如，可能对于某些资源类型，keyword 至少 2 个字符才进行搜索<ul>
<li><code>对于message字段，必须清楚提示keyword的校验规则</code></li>
</ul>
</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 406,
    &quot;message&quot;: &quot;the length of keyword should be greater than or equals to 2&quot;,
    &quot;data&quot;: {}
}</code></pre>


<ul>
<li>搜索结果分页返回，如果个别资源类型因为搜索结果过多而导致性能问题，无法返回时，</li>
<li><code>对于这种情况，权限中心产品上将会提示用户完善Keyword，尽量精确</code></li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 422,
    &quot;message&quot;: &quot;not support, too much data found&quot;,
    &quot;data&quot;: {}
}</code></pre>


<ul>
<li>接口超过调用频率控制</li>
</ul>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 429,
    &quot;message&quot;: &quot;exceed api rate limiting&quot;,
    &quot;data&quot;: {}
}</code></pre><h1 id="sdk-api">SDK 鉴权 API</h1>
<h2 id="_1">说明</h2>
<p>重要:</p>
<ol>
<li>不存在跨系统资源依赖
        - 那么请求中可以不带 resources，此时会返回 用户 在 这个系统 的这个操作 的所有策略，然后在本地进行计算;<ul>
<li>所以不存在跨系统资源依赖，可以做批量接口，一次策略查询，然后遍历本地的多个资源，逐一计算结果 (此时少了 N-1 次 IO 查询)</li>
</ul>
</li>
<li>如果存在跨系统资源依赖<ul>
<li>请求策略查询，一定要带上跨系统依赖资源，上面的示例，一定要带上 bk_cmdb; 因为权限中心需要到被依赖系统拉取相关的内容进行计算</li>
<li>所以存在跨系统资源依赖，不能做批量接口; 除非本地的多个资源依赖的是同一个其他系统资源，例如 10 个 job 作业依赖的同一个 cmdb 主机，要鉴权</li>
</ul>
</li>
<li>如果传了 resources<ul>
<li>会走两阶段计算</li>
<li>权限中心会拿 requests 中传递的资源，先行进行计算，得到中间结果(也是策略)，返回给接入系统，接入系统继续计算</li>
</ul>
</li>
</ol>
<h2 id="1-policy-query">1. policy query 拉取权限策略</h2>
<p>sdk 接入, 需要实现</p>
<ol>
<li>鉴权: 拉取权限策略</li>
<li>获取有权限的资源列表</li>
</ol>
<p>两个将使用同一个接口, 从服务端拉取策略列表</p>
<p>返回结果中包含条件表达式. 具体见<a href="../../../Reference/Expression/01-Schema.md">条件表达式协议</a></p>
<h3 id="11-url">1.1 URL</h3>
<blockquote>
<p>POST /api/v1/policy/query</p>
</blockquote>
<h3 id="12-request">1.2 Request</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">subject</td>
<td align="left">是</td>
<td align="left">鉴权实体</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">action</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">Array(resource_node)</td>
<td align="left">是</td>
<td align="left">资源实例, 资源类型的顺序必须操作注册时的顺序一致;可以为空列表</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resource_node</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 ID</td>
</tr>
<tr>
<td align="left">attribute</td>
<td align="left">对象</td>
<td align="left">是</td>
<td align="left">资源属性</td>
</tr>
</tbody>
</table>
<h4 id="cmdb">无 cmdb 依赖</h4>
<pre class="codehilite"><code class="language-json"># 1. 
{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;:
    {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;action&quot;: {
        &quot;id&quot;: &quot;edit&quot;
    },
    &quot;resources&quot;: []
}</code></pre>


<h4 id="cmdb_1">有 cmdb 依赖</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;:
    {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;action&quot;: {
        &quot;id&quot;: &quot;execute&quot;
    },
    &quot;resources&quot;: [
    {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;id&quot;: &quot;192.168.1.1&quot;
    }]
}</code></pre>


<h3 id="13-response">1.3 Response</h3>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {  // 条件表达式
        &quot;field&quot;: &quot;host.id&quot;,
        &quot;op&quot;: &quot;any&quot;,
        &quot;value&quot;: []
    }
}</code></pre>


<h2 id="2-policy-query-by-actions">2. policy query by actions 批量拉取一批操作的权限策略</h2>
<p>场景: 接入系统需要对同一资源类型的一批资源实例的多个操作鉴权, 比如资源实例列表页显示多个操作是否有权限</p>
<p>约束:</p>
<ol>
<li>一批资源的资源类型必须是一样的</li>
<li>action 如果对 cmdb 资源有依赖, 依赖的 cmdb 资源实例必须是同一个</li>
</ol>
<p>SDK 实现:</p>
<ol>
<li>批量拉取一批操作的权限策略</li>
<li>本地遍历计算资源实例是否有权限</li>
</ol>
<h3 id="21-url">2.1 URL</h3>
<blockquote>
<p>POST /api/v1/policy/query_by_actions</p>
</blockquote>
<h3 id="22-request">2.2 Request</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">subject</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">Array(action)</td>
<td align="left">是</td>
<td align="left">操作列表</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">Array(resource_node)</td>
<td align="left">是</td>
<td align="left">资源实例, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resource_node</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 ID</td>
</tr>
<tr>
<td align="left">attribute</td>
<td align="left">对象</td>
<td align="left">是</td>
<td align="left">资源属性</td>
</tr>
</tbody>
</table>
<h4 id="cmdb_2">无 cmdb 依赖</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;:
    {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;actions&quot;: [
        {
            &quot;id&quot;: &quot;edit&quot;
        },
        {
            &quot;id&quot;: &quot;view&quot;
        }
    ],
    &quot;resources&quot;: []
}</code></pre>


<h4 id="cmdb_3">有 cmdb 依赖</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;:
    {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;actions&quot;: [
        {
            &quot;id&quot;: &quot;execute&quot;
        },
        {
            &quot;id&quot;: &quot;quick_execute&quot;
        }
    ],
    &quot;resources&quot;: [
    {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;id&quot;: &quot;192.168.1.1&quot;
    }]
}</code></pre>


<h3 id="23-response">2.3 Response</h3>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: [ // action的顺序与请求中的acitons顺序一致
        {
            &quot;action&quot;:{
                &quot;id&quot;:&quot;edit&quot;
            },
            &quot;condition&quot;: {  // 条件表达式
                &quot;field&quot;: &quot;host.id&quot;,
                &quot;op&quot;: &quot;any&quot;,
                &quot;value&quot;: []
            }
        },
        {
            &quot;action&quot;:{
                &quot;id&quot;:&quot;view&quot;
            },
            &quot;condition&quot;: {  // 条件表达式
                &quot;field&quot;: &quot;host.id&quot;,
                &quot;op&quot;: &quot;any&quot;,
                &quot;value&quot;: []
            }
        }
    ]
}</code></pre>


<h2 id="3-query_by_ext_resources">3. query_by_ext_resources 批量第三方依赖鉴权策略查询</h2>
<h3 id="31">3.1 背景</h3>
<p>本系统的操作依赖外部系统资源类型, 需要大批量使用外部资源实例鉴权</p>
<p>例如: 用户在作业平台需要触发上千台主机上批量执行某个作业, 比如 需要在 host1, host2 上执行 job1</p>
<p>这个接口, 支持拉取策略的同时, 帮助接入系统到<code>依赖系统</code>拉取策略计算需要的资源信息; </p>
<p>接入系统同时拿到<code>策略</code>和<code>资源信息</code>, 就可以完成计算, 确认是否有权限;</p>
<p>注: 由于大批量遍历计算 expression 属于 cpu 密集计算, 如果计算放在 IAM, 在并发批量计算时, 会导致 IAM 服务 CPU 资源不足, 进而服务不可用, 所以需要把计算分散到接入系统分布计算, 减轻 IAM 服务的压力</p>
<h4 id="1-1000">场景 1: 外部依赖资源实例的数量<strong>不</strong>超过 1000 个</h4>
<p>使用建议:</p>
<p>直接使用<code>query_by_ext_resources</code>接口查询策略表达式与资源实例相关信息到本地后遍历计算是否有权限</p>
<h4 id="2-1000">场景 2: 外部依赖资源实例的数量<strong>超过</strong>了 1000 个</h4>
<hr />
<p>使用建议:</p>
<ol>
<li>使用<code>policy/query</code>接口查询策略表达式</li>
<li>本地计算表达式中是否有<code>any</code>, 是否有实例<code>id in ["id1", "id2"]</code>初步计算部分外部依赖资源实例是否权限</li>
<li>对于在第二步中计算无权限的资源实例, 再分批次(每次不超过 1000 个)调用<code>query_by_ext_resources</code>接口查询策略表达式与资源实例相关信息到本地后遍历计算是否有权限</li>
</ol>
<h3 id="32">3.2 使用方式</h3>
<ol>
<li>在 request body 中 resources 传 job1 相关的资源信息, 在 ext_resources 中传第三方依赖的 host1, host2</li>
<li>返回的结果中 expression 是过滤了 request 中 resource 相关条件后的条件表达式, 结果的 ext_resources 返回填充属性的资源信息</li>
<li><strong>鉴权计算</strong>: 接入系统拿到 ext_resource 后遍历每个 host 实例带入 expression 中计算得到鉴权结果</li>
</ol>
<p>注意:</p>
<ul>
<li>request 中 resources 与 ext_resources 的关系, 当前 ext_resources 只能有一种第三方依赖类型的实例, resource 必须为 action 依赖的其它资源类型的实例</li>
<li>ext_resources 一次查询不能超过 1000 个, 如果超过建议分批次查询</li>
</ul>
<hr />
<h3 id="33">3.3 协议</h3>
<h4 id="331-url">3.3.1 URL</h4>
<blockquote>
<p>POST /api/v1/policy/query_by_ext_resources</p>
</blockquote>
<h4 id="332-request">3.3.2 Request</h4>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_job&quot;,
  &quot;subject&quot;: {
    &quot;type&quot;: &quot;user&quot;,
    &quot;id&quot;: &quot;admin&quot;
  },
  &quot;action&quot;: {
    &quot;id&quot;: &quot;execute&quot;
  },
  &quot;resources&quot;: [  # 参与过滤策略的资源实例, 每种资源类型只能传1个, 可以不传, 不传时返回的表达式包含操作关联所有的资源类型的条件
    {
      &quot;system&quot;: &quot;bk_job&quot;,
      &quot;type&quot;: &quot;job&quot;,
      &quot;id&quot;: &quot;job1&quot;,
      &quot;attribute&quot;: {}
    }
  ],
  &quot;ext_resources&quot;: [  # 不参与计算的资源类型, 可以批量传入, IAM会向第三方系统查询资源的属性信息, 一次最多1000个
    {
      &quot;system&quot;: &quot;bk_cmdb&quot;,
      &quot;type&quot;: &quot;host&quot;,
      &quot;ids&quot;: [
        &quot;host1&quot;,
        &quot;host2&quot;
      ]
    }
  ]
}</code></pre>


<h4 id="333-response">3.3.3 Response</h4>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;ok&quot;,
  &quot;data&quot;: {
    &quot;expression&quot;: {  # 已经代入request中resources计算过后的表达式
      &quot;op&quot;: &quot;AND&quot;,
      &quot;content&quot;: [
        {
          &quot;op&quot;: &quot;in&quot;,
          &quot;field&quot;: &quot;host.id&quot;,
          &quot;value&quot;: [
            &quot;host1&quot;,
            &quot;host2&quot;
          ]
        },
        {
          &quot;op&quot;: &quot;starts_with&quot;,
          &quot;field&quot;: &quot;host._bk_iam_path_&quot;,
          &quot;value&quot;: [
            &quot;/biz,5/&quot;
          ]
        }
      ]
    },
    &quot;ext_resources&quot;: [  # 查询得到的第三方资源实例, 填充了与表达式相关的属性
      {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;instances&quot;: [
          {
            &quot;id&quot;: &quot;host1&quot;,
            &quot;attribute&quot;: {
              &quot;_bk_iam_path_&quot;: [
                &quot;/biz,5/&quot;
              ]
            }
          },
          {
            &quot;id&quot;: &quot;host2&quot;,
            &quot;attribute&quot;: {
              &quot;_bk_iam_path_&quot;: [
                &quot;/biz,5/&quot;
              ]
            }
          }
        ]
      }
    ]
  }
}</code></pre><h1 id="api">直接鉴权 API</h1>
<blockquote>
<p>中大型系统/平台类系统不要使用这个接口</p>
</blockquote>
<p>注意:</p>
<ul>
<li>这个 API 是给非 SDK 接入/无跨系统资源依赖的小型系统/脚本/后台任务使用的.</li>
<li>如果是普通接入系统(非脚本/定时任务等)，建议使用多语言 SDK 进行处理</li>
<li>使用直接鉴权 API，需要提供完整的信息，所有计算会在服务端完成，此时会同其他所有系统共用计算资源，性能可能不及本地 sdk 计算(本地 sdk 还可以做缓存等行为提升性能)</li>
<li>获取某个用户有某个权限的资源列表无法通过此 API 实现; 需要通过策略查询接口查询得到策略，解析表达式后，转换成自身存储的查询条件</li>
<li>该接口耗费服务端资源较大，后续会进行流控/熔断/服务降级</li>
</ul>
<h2 id="1-policy-auth">1. policy auth</h2>
<h3 id="11-url">1.1 URL</h3>
<blockquote>
<p>POST /api/v1/policy/auth</p>
</blockquote>
<h3 id="12-request">1.2 Request</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">subject</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">Array(resource_node)</td>
<td align="left">是</td>
<td align="left">资源实例, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resource_node</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 ID</td>
</tr>
<tr>
<td align="left">attribute</td>
<td align="left">对象</td>
<td align="left">是</td>
<td align="left">资源属性</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;: {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;action&quot;: {
        &quot;id&quot;: &quot;execute&quot;
    },
    &quot;resources&quot;: [{   // 资源类型的顺序必须操作注册时的顺序一致, 否则会导致鉴权失败!
        &quot;system&quot;: &quot;bk_job&quot;,
        &quot;type&quot;: &quot;job&quot;,
        &quot;id&quot;: &quot;ping&quot;,
        &quot;attribute&quot;: {  // 资源的属性值可能有多个, 目前支持string/int/boolean, 以及路径stringList
            &quot;os&quot;: &quot;linux&quot;,
            &quot;_bk_iam_path_&quot;: [&quot;/biz,1/set,2/&quot;],
            &quot;is_ready&quot;: true,
            &quot;area_id&quot;: 200
        }
    }, {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;id&quot;: &quot;192.168.1.1&quot;,
        &quot;attribute&quot;: {} // 外部资源的属性由iam负责查询属性, 接入方不需要传入
    }]
}</code></pre>


<h3 id="13-response">1.3 Response</h3>
<p>Response 字段说明, 表格</p>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {
        &quot;allowed&quot;: true
    }
}</code></pre>


<h2 id="2-policy-auth-by-resources">2. policy auth by resources</h2>
<p>鉴权场景: 查看一个 <code>用户</code> 有没有 100 台 <code>资源A</code> 的 <code>编辑</code>  权限
限制: resources_list 最大能传 100 个资源</p>
<h3 id="21-url">2.1 URL</h3>
<blockquote>
<p>POST /api/v1/policy/auth_by_resources</p>
</blockquote>
<h3 id="22-request">2.2 Request</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">subject</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">object</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">resources_list</td>
<td align="left">Array(resources)</td>
<td align="left">是</td>
<td align="left">资源实例列表, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resources</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">resources</td>
<td align="left">Array(resource_node)</td>
<td align="left">是</td>
<td align="left">一个资源</td>
</tr>
</tbody>
</table>
<p>resource_node</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 ID</td>
</tr>
<tr>
<td align="left">attribute</td>
<td align="left">对象</td>
<td align="left">是</td>
<td align="left">资源属性</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;: {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;action&quot;: {
        &quot;id&quot;: &quot;execute&quot;
    },
    &quot;resources_list&quot;: [
        [{   // 第一个资源
            &quot;system&quot;: &quot;bk_job&quot;,
            &quot;type&quot;: &quot;job&quot;,
            &quot;id&quot;: &quot;ping&quot;,
            &quot;attribute&quot;: {
                &quot;os&quot;: &quot;linux&quot;,
                &quot;_bk_iam_path_&quot;: [&quot;/biz,1/set,2/&quot;],
                &quot;is_ready&quot;: true,
                &quot;area_id&quot;: 200
            }
        }, {
            &quot;system&quot;: &quot;bk_cmdb&quot;,
            &quot;type&quot;: &quot;host&quot;,
            &quot;id&quot;: &quot;192.168.1.1&quot;,
            &quot;attribute&quot;: {}
        }],
        [{    // 第二个资源
            &quot;system&quot;: &quot;bk_job&quot;,
            &quot;type&quot;: &quot;job&quot;,
            &quot;id&quot;: &quot;ping2&quot;,
            &quot;attribute&quot;: {
                &quot;os&quot;: &quot;linux&quot;,
                &quot;_bk_iam_path_&quot;: [&quot;/biz,1/set,2/&quot;],
                &quot;is_ready&quot;: true,
                &quot;area_id&quot;: 200
            }
        }, {
            &quot;system&quot;: &quot;bk_cmdb&quot;,
            &quot;type&quot;: &quot;host2&quot;,
            &quot;id&quot;: &quot;192.168.2.2&quot;,
            &quot;attribute&quot;: {}
        }]
    ]
}</code></pre>


<h3 id="23-response">2.3 Response</h3>
<p>Response 字段说明, 表格</p>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {
        &quot;bk_job,job,ping/bk_cmdb,host,192.168.1.1&quot;: false,
        &quot;bk_job,job,ping2/bk_cmdb,host2,192.168.2.2&quot;: false
    }
}</code></pre>


<h2 id="3-policy-auth-by-actions">3. policy auth by actions</h2>
<p>鉴权场景: 查看一个<code>用户</code>有没有<code>资源A</code>的<code>查看</code>/<code>编辑</code>/<code>删除</code>权限
限制: actions 最大能传 10 个操作</p>
<h3 id="31-url">3.1 URL</h3>
<blockquote>
<p>POST /api/v1/policy/auth_by_actions</p>
</blockquote>
<h3 id="32-request">3.2 Request</h3>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">subject</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">Array(action)</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">Array(resource_node)</td>
<td align="left">是</td>
<td align="left">资源实例, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resource_node</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 ID</td>
</tr>
<tr>
<td align="left">attribute</td>
<td align="left">对象</td>
<td align="left">是</td>
<td align="left">资源属性</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;subject&quot;: {
        &quot;type&quot;: &quot;user&quot;,
        &quot;id&quot;: &quot;admin&quot;
    },
    &quot;actions&quot;: [{
        &quot;id&quot;: &quot;execute&quot;
    }, {
        &quot;id&quot;: &quot;view&quot;
    }],
    &quot;resources&quot;: [{   // 资源类型的顺序必须操作注册时的顺序一致, 否则会导致鉴权失败!
        &quot;system&quot;: &quot;bk_job&quot;,
        &quot;type&quot;: &quot;job&quot;,
        &quot;id&quot;: &quot;ping&quot;,
        &quot;attribute&quot;: {  // 资源的属性值可能有多个, 目前支持string/int/boolean, 以及路径stringList
            &quot;os&quot;: &quot;linux&quot;,
            &quot;_bk_iam_path_&quot;: [&quot;/biz,1/set,2/&quot;],
            &quot;is_ready&quot;: true,
            &quot;area_id&quot;: 200
        }
    }, {
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;type&quot;: &quot;host&quot;,
        &quot;id&quot;: &quot;192.168.1.1&quot;,
        &quot;attribute&quot;: {}  // 外部资源的属性由iam负责查询属性, 接入方不需要传入
    }]
}</code></pre>


<h3 id="33-response">3.3 Response</h3>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {
        &quot;execute&quot;: true,
        &quot;view&quot;: false
    }
}</code></pre><h1 id="url">生成无权限申请 URL</h1>
<blockquote>
<p>此文档向接入系统说明接入系统在用户无权限需要提醒用户申请时使用的 api</p>
</blockquote>
<h3 id="_1">接入系统权限申请</h3>
<p>用户在接入系统进行操作时, 如果没有某些权限, 此时需要跳转到权限中心申请对应权限.
权限中心申请页面, 需要自动填充相关的申请信息.
所以, 需要接入系统, 将相关信息预先提交到权限中心, 权限中心返回<code>权限申请URL</code></p>
<p>流程:
1. 组装权限申请信息
2. 请求 API, 获取权限申请 url
3. url 渲染到前端表单, 用户点击后, 跳转到权限中心的权限申请页面</p>
<p>具体无权限交互可以查看 <a href="../../../HowTo/Solutions/NoPermissionApply.md">文档</a></p>
<h4 id="url_1">URL</h4>
<blockquote>
<p>POST /api/c/compapi/v2/iam/application/
<code>特别说明:该 API 为ESB API</code> <a href="../01-Overview/01-BackendAPIvsESBAPI.md">ESB API 说明</a></p>
</blockquote>
<h4 id="_2">通用参数</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">bk_app_code</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">应用 ID</td>
</tr>
<tr>
<td align="left">bk_app_secret</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">安全密钥(应用 TOKEN)，可以通过 蓝鲸智云开发者中心 -&gt; 点击应用 ID -&gt; 基本信息 获取</td>
</tr>
<tr>
<td align="left">bk_token</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户登录态，bk_token 与 bk_username 必须一个有效，bk_token 可以通过 Cookie 获取</td>
</tr>
<tr>
<td align="left">bk_username</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户用户名，仅仅在 ESB 里配置免登录态验证白名单中的应用，才可以用此字段指定当前用户</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">系统 id</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">数组</td>
<td align="left">是</td>
<td align="left">申请权限的操作</td>
</tr>
</tbody>
</table>
<p>actions</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 id</td>
</tr>
<tr>
<td align="left">related_resource_types</td>
<td align="left">数组</td>
<td align="left">是</td>
<td align="left">操作关联的资源类型, <code>资源类型的顺序必须操作注册时的顺序一致</code> (<a href="../../../Reference/API/02-Model/13-Action.md">操作注册 API</a>)</td>
</tr>
</tbody>
</table>
<p>related_resource_types</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型的系统 id</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型</td>
</tr>
<tr>
<td align="left">instances</td>
<td align="left">数组[数组]</td>
<td align="left">否</td>
<td align="left">资源实例,可选</td>
</tr>
<tr>
<td align="left">attributes</td>
<td align="left">数组</td>
<td align="left">否</td>
<td align="left">实例属性,可选</td>
</tr>
</tbody>
</table>
<p>related_resource_types.instances</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源实例 id</td>
</tr>
</tbody>
</table>
<p>related_resource_types.attributes</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">属性 key</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">属性 key 名称</td>
</tr>
<tr>
<td align="left">values</td>
<td align="left">数组</td>
<td align="left">是</td>
<td align="left">属性的可选值</td>
</tr>
</tbody>
</table>
<p>related_resource_types.attributes.values</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">属性 value</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">属性 value 名称</td>
</tr>
</tbody>
</table>
<ol>
<li>无关联资源类型的操作示例:</li>
</ol>
<p>系统<code>bk_job</code>的<code>create_job</code>操作未关联资源类型</p>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_job&quot;,  # 权限的系统
  &quot;actions&quot;: [
    {
      &quot;id&quot;: &quot;create_job&quot;,  # 操作id
      &quot;related_resource_types&quot;: []  # related_resource_types 空数组表示操作不关联资源类型
    }
  ]
}</code></pre>


<ol>
<li>资源拓扑路径的操作示例:</li>
</ol>
<p>系统<code>bk_job</code>的<code>view_job</code>操作关联资源类型<code>job</code>, 并且注册了实例视图 <code>业务(biz)</code>-<code>作业(job)</code>, 这个实例视图拓扑路径有 2 层</p>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_job&quot;,  # 权限的系统
  &quot;actions&quot;: [
    {
      &quot;id&quot;: &quot;view_job&quot;,  # 操作id
      &quot;related_resource_types&quot;: [
        {
          &quot;system&quot;: &quot;bk_job&quot;,  # 资源类型所属的系统id
          &quot;type&quot;: &quot;job&quot;,  # 资源类型
          &quot;instances&quot;: [
            [  # 一个数组表示一个实例的拓扑路径, 拓扑路径必须与实例视图的资源链路一致, 业务(biz)-作业(job)
              {
                &quot;type&quot;: &quot;biz&quot;,  # 实例视图中资源的第一层业务
                &quot;id&quot;: &quot;biz1&quot;,
              },
              {
                &quot;type&quot;: &quot;job&quot;,  # 实例视图中资源拓扑路径的第二层作业
                &quot;id&quot;: &quot;job1&quot;,
              }
            ]
          ]
        }
      ]
    }
  ]
}</code></pre>


<ol>
<li>关联多个资源类型的操作示例:</li>
</ol>
<p>系统<code>bk_job</code>的<code>execute_job</code>操作关联资源类型<code>job</code>与系统<code>bk_cmdb</code>的资源类型<code>host</code>,
<code>job</code>注册了实例视图 <code>业务(biz)</code>-<code>作业(job)</code>, 这个实例视图拓扑路径有 2 层,
<code>bk_cmdb</code>的资源类型<code>host</code>注册实例视图, <code>业务(biz)</code>-<code>集群(set)</code>-<code>模块(module)</code>-<code>主机(host)</code>, 这个实例视图拓扑路径有 4 层</p>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_job&quot;,  # 权限的系统
  &quot;actions&quot;: [
    {
      &quot;id&quot;: &quot;execute_job&quot;,  # 操作id
      &quot;related_resource_types&quot;: [  # 关联几个资源类型, 这里就必须传几个item, 并且资源类型的顺序必须与注册操作时资源类型的顺序一致
        {
          &quot;system&quot;: &quot;bk_job&quot;,
          &quot;type&quot;: &quot;job&quot;,
          &quot;instances&quot;: [
            [  # 业务(biz)-作业(job)
              {
                &quot;type&quot;: &quot;biz&quot;,
                &quot;id&quot;: &quot;biz1&quot;,
              },
              {
                &quot;type&quot;: &quot;job&quot;,
                &quot;id&quot;: &quot;job1&quot;,
              }
            ]
          ]
        },
        {
          &quot;system&quot;: &quot;bk_cmdb&quot;,  # 资源类型所属的系统id
          &quot;type&quot;: &quot;host&quot;,  # 操作依赖的另外一个资源类型
          &quot;instances&quot;: [
            [  # 4层的拓扑路径, 必须与实例视图的资源链路一致: 业务(biz)-集群(set)-模块(module)-主机(host)
              {
                &quot;type&quot;: &quot;biz&quot;,
                &quot;id&quot;: &quot;biz1&quot;,
              }, {
                &quot;type&quot;: &quot;set&quot;,
                &quot;id&quot;: &quot;set1&quot;,
              }, {
                &quot;type&quot;: &quot;module&quot;,
                &quot;id&quot;: &quot;module1&quot;,
              }, {
                &quot;type&quot;: &quot;host&quot;,
                &quot;id&quot;: &quot;host1&quot;,
              }
            ]
          ],
          &quot;attributes&quot;: [  # 支持配置实例的属性值, attributes与instances的组合关系为AND
            {
              &quot;id&quot;: &quot;os&quot;,  # 属性的key
              &quot;name&quot;: &quot;操作系统&quot;,
              &quot;values&quot;: [
                {
                  &quot;id&quot;: &quot;linux&quot;,  # 属性的value, 可以有多个
                  &quot;name&quot;: &quot;linux&quot;
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}</code></pre>


<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
  &quot;data&quot;: {
    &quot;url&quot;: &quot;https://{PAAS_DOMAIN}/o/bk_iam_app/perm-apply?system_id=bk_job&amp;amp;tid=09d432dccac74ec4aa17629f5f83715f&quot;  # 链接有效期10分钟
  },
  &quot;result&quot;: true,
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;OK&quot;
}</code></pre>


<p>data</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">url</td>
<td align="left">字符串</td>
<td align="left">权限申请重定向 URL</td>
</tr>
</tbody>
</table>
<h3 id="_3">返回结果错误说明</h3>
<p>由于跳转申请后，产品上需要显示的时资源实例名称，而不是 ID，所以权限中心会回调查询接入系统
1. 如果未提供查询相关接口,则错误码 code=1902204
2. 如果查询不到资源实例的名称或接入系统不存在对应的资源实例，则错误码 code=1902416
3. 会校验 <code>related_resource_types</code>操作关联的资源类型, <code>资源类型的顺序必须操作注册时的顺序一致</code> (<a href="../../../Reference/API/02-Model/13-Action.md">操作注册 API</a>), 如果不一致, 错误码 <code>1902417</code>, 具体见文档 <a href="../../../HowTo/FAQ/ErrorCode.md">错误码</a></p><h2 id="_1">第三方鉴权失败返回权限申请数据协议</h2>
<h4 id="_2">背景</h4>
<p>标准运维调用作业平台执行作业, 如果是因为鉴权失败导致执行失败, 作业平台需要返回以下错误信息到标准运维, 标准运维使用以下数据展示需要申请的权限信息, 然后再调用以上 API 到权限中心申请权限</p>
<h4 id="http">建议：接口 HTTP 状态码</h4>
<p>http status_code = <code>200</code></p>
<h3 id="response-body">返回接口 response body 协议</h3>
<blockquote>
<p><code>字段code = 9900403 , 且需要有 permission字段返回需要对应申请的权限数据</code></p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 9900403,
  &quot;message&quot;: &quot;&quot;,
  &quot;data&quot;: null,
  &quot;permission&quot;: {
    &quot;system&quot;: &quot;bk_job&quot;,
    &quot;system_name&quot;: &quot;作业平台&quot;,
    &quot;actions&quot;: [
      {
        &quot;id&quot;: &quot;execute_job&quot;,
        &quot;name&quot;: &quot;执行作业&quot;,
        &quot;related_resource_types&quot;: [
          {
            &quot;system&quot;: &quot;bk_job&quot;,
            &quot;system_name&quot;: &quot;作业平台&quot;,
            &quot;type&quot;: &quot;job&quot;,
            &quot;type_name&quot;: &quot;作业&quot;,
            &quot;instances&quot;: [
              [
                {
                  &quot;type&quot;: &quot;job&quot;,
                  &quot;type_name&quot;: &quot;作业&quot;,
                  &quot;id&quot;: &quot;job1&quot;,
                  &quot;name&quot;: &quot;作业1&quot;
                }
              ]
            ]
          },
          {
            &quot;system&quot;: &quot;bk_cmdb&quot;,
            &quot;system_name&quot;: &quot;配置平台&quot;,
            &quot;type&quot;: &quot;host&quot;,
            &quot;type_name&quot;: &quot;主机&quot;,
            &quot;instances&quot;: [
              [
                {
                  &quot;type&quot;: &quot;biz&quot;,
                  &quot;type_name&quot;: &quot;业务&quot;,
                  &quot;id&quot;: &quot;biz1&quot;,
                  &quot;name&quot;: &quot;业务1&quot;
                },
                {
                  &quot;type&quot;: &quot;set&quot;,
                  &quot;type_name&quot;: &quot;集群&quot;,
                  &quot;id&quot;: &quot;set1&quot;,
                  &quot;name&quot;: &quot;集群1&quot;
                },
                {
                  &quot;type&quot;: &quot;module&quot;,
                  &quot;type_name&quot;: &quot;模块&quot;,
                  &quot;id&quot;: &quot;module1&quot;,
                  &quot;name&quot;: &quot;模块1&quot;
                },
                {
                  &quot;type&quot;: &quot;host&quot;,
                  &quot;type_name&quot;: &quot;主机&quot;,
                  &quot;id&quot;: &quot;host1&quot;,
                  &quot;name&quot;: &quot;主机1&quot;
                }
              ]
            ]
          }
        ]
      }
    ]
  }
}</code></pre><h1 id="_1">资源拓扑授权/回收</h1>
<h3 id="_2">参数说明</h3>
<p><code>resources.path</code>的说明</p>
<p>示例 1: 拓扑层级授权到资源实例, <em>业务 1-集群 2-主机 1</em></p>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_cmdb&quot;,
  &quot;type&quot;: &quot;host&quot;,
  &quot;path&quot;: [
    {
      &quot;type&quot;: &quot;biz&quot;,
      &quot;id&quot;: &quot;1&quot;,
      &quot;name&quot;: &quot;biz1&quot;
    },
    {
      &quot;type&quot;: &quot;set&quot;,
      &quot;id&quot;: &quot;2&quot;,
      &quot;name&quot;: &quot;set2&quot;
    },
    {
      &quot;type&quot;: &quot;host&quot;,
      &quot;id&quot;: &quot;1&quot;,
      &quot;name&quot;: &quot;host1&quot;
    }
  ]
}</code></pre>


<p>示例 2: 拓扑层级前缀, <em>业务 1-任意集群</em>, 此时只有业务 1 的集群下的主机会有权限</p>
<p><code>注意</code>: </p>
<ul>
<li>业务 1 下的主机与业务 1 下任意集群的主机的定义是不一样的</li>
<li><code>业务1下的主机</code>包含业务 1 下可能的<code>所有拓扑</code>下的所有主机</li>
<li><code>业务1下集群的所有主机</code>, 只包含特定拓扑 <code>业务-集群</code> 下的所有主机</li>
<li>为避免权限放大, 在拓扑层级授权时需要把选择到的拓扑节点的下一级的任意带上, 比如选择的是 <code>业务1</code>, 授权时传 <code>业务1-任意集群</code></li>
</ul>
<pre class="codehilite"><code class="language-json">{
  &quot;system&quot;: &quot;bk_cmdb&quot;,
  &quot;type&quot;: &quot;host&quot;,
  &quot;path&quot;: [
    {
      &quot;type&quot;: &quot;biz&quot;,
      &quot;id&quot;: &quot;1&quot;,
      &quot;name&quot;: &quot;biz1&quot;
    },
    {
      &quot;type&quot;: &quot;set&quot;,
      &quot;id&quot;: &quot;*&quot;,
      &quot;name&quot;: &quot;&quot;
    }
  ]
}</code></pre>


<h3 id="_3">资源拓扑授权/回收</h3>
<p>对单个资源拓扑, 单个操作的授权与回收接口</p>
<p><code>注意</code>: </p>
<ul>
<li><code>resources.type</code>的是操作关联的资源类型, <code>resources.path</code>是资源类型能选择的拓扑层级</li>
<li><code>resources.path</code>的路径必须与接入系统注册的资源实例选择视图的拓扑层级一致, 否则授权的拓扑层级在权限中心会出现在视图中选择不中(打不上勾)的情况</li>
</ul>
<hr />
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/c/compapi/v2/iam/authorization/path/
<code>特别说明:该 API 为ESB API</code> <a href="../01-Overview/01-BackendAPIvsESBAPI.md">ESB API 说明</a></p>
</blockquote>
<h4 id="_4">通用参数</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">bk_app_code</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">应用 ID</td>
</tr>
<tr>
<td align="left">bk_app_secret</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">安全密钥(应用 TOKEN)，可以通过 蓝鲸智云开发者中心 -&gt; 点击应用 ID -&gt; 基本信息 获取</td>
</tr>
<tr>
<td align="left">bk_token</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户登录态，bk_token 与 bk_username 必须一个有效，bk_token 可以通过 Cookie 获取</td>
</tr>
<tr>
<td align="left">bk_username</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户用户名，仅仅在 ESB 里配置免登录态验证白名单中的应用，才可以用此字段指定当前用户</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">asynchronous</td>
<td align="left">布尔</td>
<td align="left">是</td>
<td align="left">是否异步调用, 默认 否, 当前只支持同步</td>
</tr>
<tr>
<td align="left">operate</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">grant 或 revoke</td>
</tr>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">系统 id</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">数组[对象]</td>
<td align="left">是</td>
<td align="left">资源拓扑, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resources</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">path</td>
<td align="left">数组[对象]</td>
<td align="left">是</td>
<td align="left">资源的拓扑</td>
</tr>
</tbody>
</table>
<p>resources.path</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点实例 ID</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点实例名称</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
  &quot;asynchronous&quot;: false,  # 默认false, 当前只支持同步
  &quot;operate&quot;: &quot;grant&quot;,   # grant 授权 revoke 回收
  &quot;system&quot;: &quot;bk_cmdb&quot;,
  &quot;action&quot;: {
    &quot;id&quot;: &quot;edit_host&quot;
  },
  &quot;subject&quot;: {  # 当前只能对user授权
    &quot;type&quot;: &quot;user&quot;,
    &quot;id&quot;: &quot;admin&quot;
  },
  &quot;resources&quot;: [  # 操作依赖多个资源类型的情况下, 表示一个组合资源, 资源类型的顺序必须操作注册时的顺序一致
    {
      &quot;system&quot;: &quot;bk_cmdb&quot;,
      &quot;type&quot;: &quot;host&quot;,
      &quot;path&quot;: [
        {
          &quot;type&quot;: &quot;biz&quot;,
          &quot;id&quot;: &quot;1&quot;,
          &quot;name&quot;: &quot;biz1&quot;
        },{
          &quot;type&quot;: &quot;set&quot;,
          &quot;id&quot;: &quot;*&quot;,
          &quot;name&quot;: &quot;&quot;
        }
      ]
    }
  ]
}</code></pre>


<h4 id="response">Response</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">policy_id</td>
<td align="left">数值</td>
<td align="left">权限策略 id</td>
<td align="left"></td>
</tr>
</tbody>
</table>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;ok&quot;,
  &quot;data&quot;: {
    &quot;policy_id&quot;: 1
  }
}</code></pre>


<h4 id="response-when-async">Response when async (未实现)</h4>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;ok&quot;,
  &quot;data&quot;: {
    &quot;task_id&quot;: 1  // 任务id
  }
}</code></pre><h1 id="_1">批量资源拓扑授权/回收</h1>
<p>对多个资源拓扑, 多个操作的授权与回收接口</p>
<p><code>resources.paths</code>是批量的资源实例拓扑, 具体说明可以参考<a href="../06-GrantRevoke/01-Topology.md">资源拓扑授权/回收</a></p>
<hr />
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/c/compapi/v2/iam/authorization/batch_path/
<code>特别说明:该 API 为ESB API</code> <a href="../01-Overview/01-BackendAPIvsESBAPI.md">ESB API 说明</a></p>
</blockquote>
<h4 id="_2">通用参数</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">bk_app_code</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">应用 ID</td>
</tr>
<tr>
<td align="left">bk_app_secret</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">安全密钥(应用 TOKEN)，可以通过 蓝鲸智云开发者中心 -&gt; 点击应用 ID -&gt; 基本信息 获取</td>
</tr>
<tr>
<td align="left">bk_token</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户登录态，bk_token 与 bk_username 必须一个有效，bk_token 可以通过 Cookie 获取</td>
</tr>
<tr>
<td align="left">bk_username</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户用户名，仅仅在 ESB 里配置免登录态验证白名单中的应用，才可以用此字段指定当前用户</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">asynchronous</td>
<td align="left">布尔</td>
<td align="left">是</td>
<td align="left">是否异步调用, 默认 否, 当前只支持同步</td>
</tr>
<tr>
<td align="left">operate</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">grant 或 revoke</td>
</tr>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">系统 id</td>
</tr>
<tr>
<td align="left">actions</td>
<td align="left">数组[对象]</td>
<td align="left">是</td>
<td align="left">操作</td>
</tr>
<tr>
<td align="left">subject</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象</td>
</tr>
<tr>
<td align="left">resources</td>
<td align="left">数组[对象]</td>
<td align="left">是</td>
<td align="left">资源拓扑, 资源类型的顺序必须操作注册时的顺序一致</td>
</tr>
</tbody>
</table>
<p>actions</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<p>subject</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象类型, 当前只支持 user</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">授权对象 ID</td>
</tr>
</tbody>
</table>
<p>resources</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源系统 ID</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">资源类型 ID</td>
</tr>
<tr>
<td align="left">paths</td>
<td align="left">数组[[对象]]</td>
<td align="left">是</td>
<td align="left">批量资源拓扑，<code>最多1000个</code></td>
</tr>
</tbody>
</table>
<p>resources.paths</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">type</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点类型 ID</td>
</tr>
<tr>
<td align="left">id</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点实例 ID</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">字符串</td>
<td align="left">是</td>
<td align="left">拓扑节点实例名称</td>
</tr>
</tbody>
</table>
<pre class="codehilite"><code class="language-json">{
  &quot;asynchronous&quot;: false,
  &quot;operate&quot;: &quot;grant&quot;,
  &quot;system&quot;: &quot;bk_cmdb&quot;,
  &quot;actions&quot;: [  # 批量的操作
    {
      &quot;id&quot;: &quot;edit_host&quot;
    }
  ],
  &quot;subject&quot;: {
    &quot;type&quot;: &quot;user&quot;,
    &quot;id&quot;: &quot;admin&quot;
  },
  &quot;resources&quot;: [
    {  # 操作关联的资源类型, 必须与所有的actions都匹配, 资源类型的顺序必须操作注册时的顺序一致
      &quot;system&quot;: &quot;bk_cmdb&quot;,
      &quot;type&quot;: &quot;host&quot;,
      &quot;paths&quot;: [  # 批量资源拓扑
        [
          {
            &quot;type&quot;: &quot;biz&quot;,
            &quot;id&quot;: &quot;1&quot;,
            &quot;name&quot;: &quot;biz1&quot;
          },
          {
            &quot;type&quot;: &quot;set&quot;,
            &quot;id&quot;: &quot;*&quot;,
            &quot;name&quot;: &quot;&quot;
          }
        ]
      ]
    }
  ]
}</code></pre>


<h4 id="response">Response</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">policy_id</td>
<td align="left">数值</td>
<td align="left">权限策略 id</td>
</tr>
<tr>
<td align="left">action</td>
<td align="left">对象</td>
<td align="left">操作</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;ok&quot;,
  &quot;data&quot;: [
    {
      &quot;action&quot;: {
        &quot;id&quot;: &quot;edit_host&quot;
      },
      &quot;policy_id&quot;: 1
    }
  ]
}</code></pre>


<h4 id="response-when-async">Response when async (未实现)</h4>
<pre class="codehilite"><code class="language-json">{
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;ok&quot;,
  &quot;data&quot;: {
    &quot;task_id&quot;: 1  // 任务id
  }
}</code></pre><h1 id="_1">新建关联属性授权接口</h1>
<h3 id="_2">接口基本说明</h3>
<ul>
<li>
<p>背景：</p>
<ul>
<li>接入系统上批量资源实例被创建时，对应的创建者应该需要赋予依赖这批实例的某个属性的相关权限<ul>
<li>比如批量作业创建时，创建者需要有属性为 creator=xxx 的作业的编辑、删除和查看权限</li>
</ul>
</li>
</ul>
</li>
<li>
<p>流程:</p>
<ul>
<li>
<ol>
<li><strong>用户</strong>在<strong>接入系统</strong>上产生资源实例</li>
</ol>
</li>
<li>
<ol>
<li><strong>接入系统</strong>请求 API,  <strong>权限中心</strong>根据 <a href="../02-Model/19-ResourceCreatorAction.md">新建关联</a> 配置对应创建者进行授权</li>
</ol>
</li>
</ul>
</li>
<li>
<p>接口描述： </p>
<ul>
<li>接入系统根据资源实例创建，对创建者进行相关属性授权</li>
</ul>
</li>
<li>
<p><code>接口特别说明</code></p>
<ul>
<li>新建关联的 Actions 对应的依赖资源类型必须 selection_mode 为 all 或 attribute（Action 无关联实例除外）且只能有一种依赖资源，否则新建关联授权时会被<code>自动忽略</code></li>
</ul>
</li>
</ul>
<hr />
<h4 id="url">URL</h4>
<blockquote>
<p>POST /api/c/compapi/v2/iam/authorization/resource_creator_action_attribute/
<code>特别说明:该 API 为ESB API</code> <a href="../01-Overview/01-BackendAPIvsESBAPI.md">ESB API 说明</a></p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<ul>
<li>通用参数</li>
</ul>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">bk_app_code</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">应用 ID</td>
</tr>
<tr>
<td align="left">bk_app_secret</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">安全密钥(应用 TOKEN)，可以通过 蓝鲸智云开发者中心 -&gt; 点击应用 ID -&gt; 基本信息 获取</td>
</tr>
<tr>
<td align="left">bk_token</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户登录态，bk_token 与 bk_username 必须一个有效，bk_token 可以通过 Cookie 获取</td>
</tr>
<tr>
<td align="left">bk_username</td>
<td align="left">string</td>
<td align="left">否</td>
<td align="left">当前用户用户名，仅仅在 ESB 里配置免登录态验证白名单中的应用，才可以用此字段指定当前用户</td>
</tr>
</tbody>
</table>
<ul>
<li>接口参数</li>
</ul>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">系统唯一标识</td>
</tr>
<tr>
<td align="left">type</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源类型的唯一标识</td>
</tr>
<tr>
<td align="left">creator</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源实例的创建者</td>
</tr>
<tr>
<td align="left">attributes</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">资源属性列表，<code>多个属性之间的权限逻辑是AND</code></td>
</tr>
</tbody>
</table>
<p>attributes 列表的元素说明</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性的唯一标识</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性的名称</td>
</tr>
<tr>
<td align="left">values</td>
<td align="left">array(object)</td>
<td align="left">是</td>
<td align="left">资源属性的值，支持多个值，<code>多个值之间的权限逻辑是OR</code></td>
</tr>
</tbody>
</table>
<p>values 列表的元素说明</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性值的唯一标识</td>
</tr>
<tr>
<td align="left">name</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">资源属性值的名称</td>
</tr>
</tbody>
</table>
<h4 id="request">Request</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;system&quot;: &quot;bk_sops&quot;,
    &quot;type&quot;:&quot;task&quot;,
    &quot;creator&quot;:&quot;admin&quot;,
    &quot;attributes&quot;: [
        {
            &quot;id&quot;:&quot;owner&quot;,
            &quot;name&quot;:&quot;任务所属者&quot;,
            &quot;values&quot;: [
                {
                    &quot;id&quot;: &quot;admin&quot;,
                    &quot;name&quot;: &quot;admin(管理员)&quot;
                }
            ]
        }
    ]
}</code></pre>


<h4 id="response">Response</h4>
<p>data 数组元素</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">action</td>
<td align="left">object</td>
<td align="left">creator 被授权对应的 Action</td>
</tr>
<tr>
<td align="left">policy_id</td>
<td align="left">int</td>
<td align="left">creator 被授权对应的策略 ID</td>
</tr>
</tbody>
</table>
<p>action</p>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">id</td>
<td align="left">string</td>
<td align="left">操作 ID</td>
</tr>
</tbody>
</table>
<blockquote>
<p>Status: 200 OK</p>
</blockquote>
<pre class="codehilite"><code class="language-json">{
  &quot;data&quot;: [  // 表示creator被授权对应的Action和策略ID列表
    {
        &quot;action&quot;: {
            &quot;id&quot;: &quot;edit&quot;
        },
        &quot;policy_id&quot;: 1
    },
    {
        &quot;action&quot;: {
            &quot;id&quot;: &quot;list&quot;
        },
        &quot;policy_id&quot;: 2
    },
    {
        &quot;action&quot;: {
            &quot;id&quot;: &quot;delete&quot;
        },
        &quot;policy_id&quot;: 3
    },
    {
        &quot;action&quot;: {
            &quot;id&quot;: &quot;view&quot;
        },
        &quot;policy_id&quot;: 4
    }
  ],
  &quot;result&quot;: true,
  &quot;code&quot;: 0,
  &quot;message&quot;: &quot;OK&quot;
}</code></pre><h1 id="api">查询类 API</h1>
<h2 id="_1">背景</h2>
<p>接入系统通过 LBAC 方案接入, 可以自由控制资源权限的授权和回收;</p>
<p>此时能感知到对应策略的<code>PolicyID</code>;</p>
<p>权限中心后台提供了以下查询接口, 用于接入系统查询<code>自己系统</code>的<code>权限信息</code></p>
<p>可以配合策略变更的<code>发布-订阅</code>机制, 做定时全量的策略拉取, 用于数据校准;</p>
<p>(类似于 k8s 的 list-watch 机制, list 调用全量查询接口, watch 使用发布订阅机制感知到增量变化)</p>
<h2 id="_2">接口前置说明</h2>
<p>请阅读 <a href="../01-Overview/02-APIBasicInfo.md">接口协议前置说明</a></p><h1 id="policy-get">policy get 获取某条策略详情</h1>
<p>根据策略 ID, 获取策略详情</p>
<p>注意:
- 如果<code>policy_id</code>对应记录不存在(错误的 ID 或者已经被删除), 将会返回<code>code=1901404(NotFoundError)</code> 
- 只能查询自己系统的策略详情, 如果是其他系统的 policy ID, 将会返回<code>code=1901403(ForbiddenError)</code> 
- 返回结果中<code>expired_at</code>为过期时间, 需二次判定是否过期(查回来一刻可能还没过期, 但是传递使用时可能已过期)</p>
<h4 id="url">URL</h4>
<blockquote>
<p>GET /api/v1/systems/{system_id}/policies/{policy_id}</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">policy_id</td>
<td align="left">integer</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">策略 ID</td>
</tr>
</tbody>
</table>
<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {
        &quot;version&quot;: &quot;1&quot;,
        &quot;id&quot;: 2,
        &quot;system&quot;: &quot;bk_cmdb&quot;,
        &quot;subject&quot;: {
            &quot;type&quot;: &quot;user&quot;,
            &quot;id&quot;: &quot;admin&quot;,
            &quot;name&quot;: &quot;管理员&quot;
        },
        &quot;action&quot;: {
            &quot;id&quot;: &quot;view_host&quot;
        },
        &quot;expression&quot;: {
            &quot;content&quot;: [
                {
                    &quot;field&quot;: &quot;host.id&quot;,
                    &quot;op&quot;: &quot;any&quot;,
                    &quot;value&quot;: []
                }
            ],
            &quot;op&quot;: &quot;OR&quot;
        },
        &quot;expired_at&quot;: 4102444800
    }
}</code></pre><h1 id="policy-list">policy list 拉取系统下某个操作的策略列表</h1>
<p>用于接入系统批量拉取某个 action 的所有策略; 全量带翻页; 
接入系统可以利用这个接口, 定期拉取策略进行全量校验及<code>补偿</code></p>
<p>关于 timestamp 的说明:
- 由于策略是带过期时间的, 翻页查询的过程是一个时间跨度比较长的操作, 如果每一页实时查询<code>当前未过期</code>的策略列表, 那么整体结果集及固定页码里面的策略内容将会动态变化; 接入系统无法真正拉取某个操作<code>全量</code>策略
- 这个接口拉取第一页, 默认设置<code>timestamp</code>为当天<code>00:00:00</code>的时间戳, 例如<code>1593273600</code>
- 当翻第二页到最后一页的过程中, 接入系统建议将<code>timestamp</code>作为参数传入; 以定位一个<code>锚点</code>; 防止翻页过程中跨天导致的策略列表动态变化; (如果不担心这个, 可以一直不传)
- <code>timestamp</code> 最小为<code>当前时间-24小时</code></p>
<p>注意:
- 查询回去的每条策略中<code>expired_at</code>为过期时间, 接入系统在使用前需要再次判定是否过期
- 只能查询自己系统的<code>action_id</code>, 如果是在本系统找不到这个<code>action_id</code>不存在, 将会返回<code>code=1901404(NotFoundError)</code> </p>
<hr />
<h4 id="url">URL</h4>
<blockquote>
<p>GET  /api/v1/systems/{system_id}/policies</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">action_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">query</td>
<td align="left">操作 ID(action id), 必须是这个系统注册到权限中心的合法 Action</td>
</tr>
<tr>
<td align="left">page</td>
<td align="left">integer</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">页码, 不传默认为<code>1</code></td>
</tr>
<tr>
<td align="left">page_size</td>
<td align="left">integer</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">单页大小,不传默认<code>100</code>, 限制单页最大<code>500</code></td>
</tr>
<tr>
<td align="left">timestamp</td>
<td align="left">integer</td>
<td align="left">否</td>
<td align="left">query</td>
<td align="left">查询时间戳, 锚点</td>
</tr>
</tbody>
</table>
<p>示例: <code>action_id=edit_host&amp;page=1&amp;page_size=100&amp;timestamp=1592899208</code></p>
<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: {
        &quot;metadata&quot;: {
            &quot;system&quot;: &quot;bk_cmdb&quot;,
            &quot;action&quot;: {
                &quot;id&quot;: &quot;edit_host&quot;
            },
            &quot;timestamp&quot;: 1593273600
        },
        &quot;count&quot;: 3,
        &quot;results&quot;: [
            {
                &quot;version&quot;: &quot;1&quot;,
                &quot;id&quot;: 3,
                &quot;subject&quot;: {
                    &quot;type&quot;: &quot;user&quot;,
                    &quot;id&quot;: &quot;test2&quot;,
                    &quot;name&quot;: &quot;test2&quot;
                },
                &quot;expression&quot;: {
                    &quot;content&quot;: [
                        {
                            &quot;field&quot;: &quot;host.id&quot;,
                            &quot;op&quot;: &quot;eq&quot;,
                            &quot;value&quot;: &quot;192.168.1.1&quot;
                        }
                    ],
                    &quot;op&quot;: &quot;OR&quot;
                },
                &quot;expired_at&quot;: 4102444800
            },
            {
                &quot;version&quot;: &quot;1&quot;,
                &quot;id&quot;: 4,
                &quot;subject&quot;: {
                    &quot;type&quot;: &quot;user&quot;,
                    &quot;id&quot;: &quot;test1&quot;,
                    &quot;name&quot;: &quot;test1&quot;
                },
                &quot;expression&quot;: {
                    &quot;content&quot;: [
                        {
                            &quot;field&quot;: &quot;host.system&quot;,
                            &quot;op&quot;: &quot;eq&quot;,
                            &quot;value&quot;: &quot;linux&quot;
                        }
                    ],
                    &quot;op&quot;: &quot;OR&quot;
                },
                &quot;expired_at&quot;: 4102444800
            },
            {
                &quot;version&quot;: &quot;1&quot;,
                &quot;id&quot;: 7,
                &quot;subject&quot;: {
                    &quot;type&quot;: &quot;user&quot;,
                    &quot;id&quot;: &quot;admin&quot;,
                    &quot;name&quot;: &quot;管理员&quot;
                },
                &quot;expression&quot;: {
                    &quot;content&quot;: [
                        {
                            &quot;field&quot;: &quot;host.id&quot;,
                            &quot;op&quot;: &quot;any&quot;,
                            &quot;value&quot;: []
                        }
                    ],
                    &quot;op&quot;: &quot;OR&quot;
                },
                &quot;expired_at&quot;: 4102444800
            }
        ]
    }
}</code></pre><h1 id="policy-subjects-id">policy subjects 根据策略 ID 拉群策略对应的用户信息</h1>
<p>基于 LBAC 方案, 最终每个资源会打上一批 label, 这批 label 对应一批 Policy IDs
查询这个资源的有某个权限的用户列表时, 可以将这批 Policy IDs 作为这个接口参数, 查询<code>用户列表</code></p>
<p>注意: 
- 只能查询自己系统的策略列表对应的<code>用户列表</code>
- 如果 policyID 是其他系统的, 将会被<code>过滤掉</code>, 接口正常, 但对应的 policyId 不会出现在结果列表中</p>
<h4 id="url">URL</h4>
<blockquote>
<p>GET /api/v1/systems/{system_id}/policies/-/subjects</p>
</blockquote>
<h4 id="parameters">Parameters</h4>
<table>
<thead>
<tr>
<th align="left">字段</th>
<th align="left">类型</th>
<th align="left">是否必须</th>
<th align="left">位置</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">system_id</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">path</td>
<td align="left">系统 ID</td>
</tr>
<tr>
<td align="left">ids</td>
<td align="left">string</td>
<td align="left">是</td>
<td align="left">query</td>
<td align="left">策略 id, 多个以英文逗号分隔</td>
</tr>
</tbody>
</table>
<p>示例: <code>ids=2,3,4,7,9</code></p>
<h4 id="response">Response</h4>
<pre class="codehilite"><code class="language-json">{
    &quot;code&quot;: 0,
    &quot;message&quot;: &quot;ok&quot;,
    &quot;data&quot;: [
        {
            &quot;id&quot;: 2,
            &quot;subject&quot;: {
                &quot;type&quot;: &quot;user&quot;,
                &quot;id&quot;: &quot;admin&quot;,
                &quot;name&quot;: &quot;管理员&quot;
            }
        },
        {
            &quot;id&quot;: 3,
            &quot;subject&quot;: {
                &quot;type&quot;: &quot;user&quot;,
                &quot;id&quot;: &quot;test2&quot;,
                &quot;name&quot;: &quot;test2&quot;
            }
        },
        {
            &quot;id&quot;: 4,
            &quot;subject&quot;: {
                &quot;type&quot;: &quot;user&quot;,
                &quot;id&quot;: &quot;test1&quot;,
                &quot;name&quot;: &quot;test1&quot;
            }
        },
        {
            &quot;id&quot;: 7,
            &quot;subject&quot;: {
                &quot;type&quot;: &quot;user&quot;,
                &quot;id&quot;: &quot;admin&quot;,
                &quot;name&quot;: &quot;管理员&quot;
            }
        }
    ]
}</code></pre>
    </body>
    </html>
    